perm filename DFTP.MAC[NET,MRC]8 blob
sn#259685 filedate 1977-01-25 generic text, type T, neo UTF8
TITLE DFTP Datacomputer File Transfer Program
; Bugs/Gripes to Bug-DFTP at MIT-AI
; Current DFTP hackers: WRB@CCA(general, TENEX, TOPS-10)
; MRC@MIT-AI(ITS, SU-AI, TOPS-10)
IFNDEF F.TENX,<F.TENX==1> ; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX
IFNDEF F.PCAP,<F.PCAP==0> ; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED
IFNDEF F.SAIL,<F.SAIL==0> ; -1 IF TOPS-10 VERSION FOR SAIL
IFN F.SAIL,<F.TENX==0>
IF1,<
IFL F.TENX,<PRINTX Assembling ITS version>
IFE F.TENX,<IFE F.SAIL,<PRINTX TOPS-10...>
IFN F.SAIL,<PRINTX Assembling SAIL version>
>
IFG F.TENX,<PRINTX TENEX...>
IFN F.PCAP,<PRINTX Privileged capabilities restricted>
>
; ***DEFINITIONS***
DCHOST==37
DCSOKT==203
DEFALO==12
SIZBLK==200
SIZPAG==1000
LBSIZE==100
SBSIZE==20
; REGISTER DEFINITIONS
R1==1
R2==2
R3==3
R4==4
R5==5
R6==6
R7==7
R10==10
R11==11
R12==12
R13==13
R14==14
R15==15
R16==16
R17==17
; (SCRATCH REGISTERS)
X1==1
X2==2
X3==3
X4==4
; (COMMONLY USED REGISTERS)
IO==R5
BP==R6
FLAG==R15
UTIL==R16
STAK==R17
; (TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
TCIO==R2 ; IO(REGISTER)
TCIBP==R3 ; B(YTE)P(OINTER)
TCIACB==R4 ; A(DDRESSOF)C(ONTROL)B(LOCK)
TCITLP==R5 ; T(RACE)L(IST)P(OINTER)
TCITCC==R6 ; T(RACE)C(OMMAND)C(OUNTER)
TCIPBP==R7 ; P(ARALLEL)B(YTE)P(OINTER)
TCIPCC==R10 ; P(ARALLEL)C(HARACTER)C(OUNTER)
TCISBP==R11 ; S(ERIAL)B(YTE)P(OINTER)
TCISCC==R12 ; S(ERIAL)C(HARACTER)C(OUNTER)
TCIMAC==R13 ; MA(TCHES--)C(OMMANDS)
TCIMAN==R14 ; MA(TCHES--)N(ULLCHARACTER)
; MACRO DEFINITIONS
SALL
IFL F.TENX,<DEFINE RELOC(ADDR)<LOC ADDR>> ; ABS ASSEMBLY ON ITS
DEFINE BEGINR(SAVLST,%RETN)
< ..SAVL==0
..SAVC==0
IFIDN <SAVLST><ALL>,<..SAVL==77777>
IFDIF <SAVLST><ALL>,<
IRP SAVLST,<
IFG <SAVLST>-20,<!!
PRINTX SAVLST NOT A REGISTER>
IFLE <SAVLST>-20,<
IFN ..SAVL&1←SAVLST,<!!
PRINTX SAVLST SAVED TWICE>
..SAVL==..SAVL!1←SAVLST
..SAVC==..SAVC+1>>>
IFN ..SAVL,<
..REG==17
REPEAT 20,<
IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
..REG==..REG-1>>
DEFINE .%RETN <%RETN> ; UNIQUE LOCATION FOR RETURN AND ENDR
DEFINE .%RETL <%RETN':!>
..SFLG==0 ; LARGEST SKIP RETURN
>
; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
; JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
; ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>
; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>
; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE ENDR(SK,N)
< IFB <SK>,<..N==0>
IFIDN <SK><SKIP>,<..N==N
IFG <..N-..SFLG>,<..SFLG==..N>>
IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
REPEAT ..SFLG,<
AOS -..SAVC(STAK)>>
.%RETL
..REG==0
REPEAT 20,<
IFN ..SAVL&1←..REG,<POP STAK,..REG
..SAVL==..SAVL-1←..REG>
..REG==..REG+1>
POPJ STAK,>
DEFINE CALLR(ROUTIN)
< PUSHJ STAK,ROUTIN>
DEFINE TAIN(MSG)
< HRRZI X1,MSG
CALLR $TAIN$>
DEFINE TCIN(CLIST,RSTR)
< MOVE TCIO,[RSTR,,CLIST]
CALLR $TCIN$>
DEFINE TCIL(ARG)
< ..CMCH==0
..CMWD==0
..CNUM==0
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..CNUM==..CNUM+1
..IDX==0
IRPC ARG<..IDX==..IDX+1>
IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
..FLAG==<-..FLAG>>
IFL ..FLAG,<!!
PRINTX BAD ARGUMENTS TO TCIN>
..CMWD==<<<..CMCH-1>/5>+1>
..LOC1==.
..LOC2==..LOC1+4
..LOC3==..LOC2+..CNUM
RELOC ..LOC3
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..IDX==0
IRPC ARG<..IDX==..IDX+1>
..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
ASCII /ARG/
IFG ..IDX,<REPEAT ..IDX, <0>>
..LOC3==.>
IFL ..FLAG,<
RELOC ..LOC2
ARG
..LOC2==.
RELOC ..LOC3>
..FLAG==<-..FLAG>>
RELOC ..LOC1
..LOC2
..CNUM
..CMCH
..CMWD
RELOC ..LOC3>
DEFINE TSIN(BUFFER,BUFS,MSG,NOECHO)
< MOVE IO,[BUFFER,,5*BUFS]
IFB <NOECHO>,< HRRZI UTIL,MSG>
IFNB <NOECHO>,< HRROI UTIL,MSG>
CALLR $TSIN$>
DEFINE TNIN(MSG,RADIX)
< IFB <RADIX>,< MOVE IO,[MSG,,↑D10]>
IFNB <RADIX>,< MOVE IO,[MSG,,RADIX]>
CALLR $TNIN$>
DEFINE TNOUT(REG,RADIX)
< IFN <X1-REG>,< MOVE X1,REG>
IFB <RADIX>,< HRRZI X2,↑D10>
IFNB <RADIX>,< HRRZI X2,RADIX>
CALLR $NOUT$>
DEFINE DCNOUT(REG,RADIX)
< IFN <X1-REG>,< MOVE X1,REG>
IFB <RADIX>,< HRROI X2,↑D10>
IFNB <RADIX>,< HRROI X2,RADIX>
CALLR $NOUT$>
DEFINE PATH(STRING,FLAGS)
< IFB <FLAGS>,< HRRZI FLAG,STRING>
IFNB <FLAGS>,<
HRRI FLAG,STRING
HRLI FLAG,FLAGS>
CALLR $PATH$>
DEFINE SCOPY(SOURCE,DESTIN)
< ILDB 0,SOURCE
JUMPE 0,.+3
IDPB 0,DESTIN
JRST .-3
MOVE SOURCE,DESTIN
IDPB 0,SOURCE>
; SYSTEM DEPENDENT DEFINITIONS
; ((ITS))
IFL F.TENX,<
SEARCH SITS
LOC 150
OPDEF THUD [.LOSE 1000]
; Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO. First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).
INIT: MOVSI (JUMPA)
HRR .JBSA##
.BREAK 12,[400001,,] ;set start address
SETZ 1,
MOVE [1,,2]
BLT 150
.BREAK 16,100000 ;return to DDT
JRST DFTP
; I/O Channels
TTI==1 ; TTY I/O
TTO==2
DCI==3 ; Datalanguage I/O
DCO==4
ICP==5 ; ICP channel
DDI==6 ; Data I/O
DDO==7
LCI==10 ; Local input
LCO==11 ; Local output
; ITS network definitions
%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11
DEFINE TBIN(REG)
< .IOT TTI,REG
CAIN REG,15
MOVEI REG,12
CAIG REG,"z"
CAIGE REG,"a"
CAIA
TRZ REG," ">
TBOUT==<.IOT TTO,>
DEFINE TSOUT(STRING)
< IRP STRING
< MOVEI X1,STRING
CALLR $STRIN
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$STRIN: BEGINR
HRLI X1,(POINT 7,) ; build a byte pointer
$STRI1: ILDB X1 ; get a character from string
JUMPE RETN(0) ; quit when done
.IOT TTO, ; output the character
JRST $STRI1
ENDR
DEFINE DCBIN(REG)
< .IOT DCI,REG
SKIPE FLAGDD
.IOT TTO,REG
>
DCBOUT==<.IOT DCO,>
DEFINE DCSOUT(STRING)
< IRP STRING
< MOVEI X1,STRING
CALLR $DSTRI
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$DSTRI: BEGINR
HRLI X1,(POINT 7,) ; build a byte pointer
$DSTR1: ILDB X1 ; get a character from string
JUMPE RETN(0) ; quit when done
.IOT DCO, ; output the character
SKIPE FLAGDD ; show DATALANGUAGE?
.IOT TTO,
JRST $DSTR1 ; and loop for more
ENDR
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
TWOSEG
RELOC 400000
OPDEF THUD [JSP FLAG,OOPS]
IFN F.SAIL,<IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>>
DCCHAN==1
DDCHAN==2
LFCHAN==3
LDCHAN==4
; DEFINITIONS FROM "IMP.MAC"
.IBDEV==0
.IBSTT==1
.IBERR==1
.IBLCL==2
.IBHST==3
.IBRMT==4
.IUSTT==0
.IUCON==3
.IUCLS==4
.IULSN==5
.IULHS==15
.IESOF==5
.IESKT==11
.IEDWN==13
.IETIM==15
DEFINE TBIN(REG)
< TTCALL 0,REG
CAIE REG,175
CAIN REG,176
MOVEI REG,33
CAILE REG,"Z"+40
JRST .+3
CAIL REG,"A"+40
SUBI REG,40>
DEFINE TBOUT(REG)
< TTCALL 1,REG>
DEFINE TSOUT(STRING)
< IRP STRING
< TTCALL 3,STRING>>
DEFINE DCBIN(REG)
< SKIPG DCIBUF+2
CALLR NUTMI
SOS DCIBUF+2
ILDB REG,DCIBUF+1
JUMPE REG,.-4>
DEFINE DCBOUT(REG)
< IDPB REG,DCOBUF+1
OUT DCCHAN,
JRST .+2
JRST NETEOT>
DEFINE DCSOUT(STRING)
< IRP STRING
< HRRZI X1,STRING
CALLR NUTMO>
OUT DCCHAN,
JRST .+2
JRST NETEOT>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
SEARCH STENEX
THUD==-1
DEFINE TBIN(REG)
< PBIN
CAILE X1,"Z"+40
JRST .+3
CAIL X1,"A"+40
SUBI X1,40
IFN <X1-REG>,< HRRZI REG,(X1)>>
DEFINE TBOUT(REG)
< IFN <X1-REG>,< HRRZI X1,(REG)>
PBOUT>
DEFINE TSOUT(STRING)
< IRP STRING
< HRROI X1,STRING
PSOUT>>
DEFINE DCBIN(REG)
< MOVE X1,DCIJFN
BIN
SKIPN FLAGDD
JRST .+3
HRRZI X1,(X2)
PBOUT
HRRZI REG,(X2)>
DEFINE DCBOUT(REG)
< MOVE X1,DCOJFN
HRRZI X2,(REG)
BOUT
MOVEI X2,21
MTOPR>
DEFINE DCSOUT(STRING)
< ..IDX==1
IRP STRING<..IDX==..IDX+2>
SKIPN FLAGDD
JRST .+..IDX
IRP STRING
< HRROI X1,STRING
PSOUT>
MOVE X1,DCOJFN
SETZ X3,
IRP STRING
< HRROI X2,STRING
SOUT>
MOVEI X2,21
MTOPR>
>
; (((↑↑↑)))
; "<FILE"> FILE LIST(0,55,256),CAT,B=36
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),C=1
; EXTENSION STRING(0,3,79),C=1
; STATUS STRING(1),F=' '
; CREATIONDATE STRING(1,18,79),F='?',C=1
; SAVEDATE STRING(1,18,79),F='?',C=1
; VERSION INTEGER
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; INDEX BYTE,V=I
; COUNT BYTE
; DATA STRING(0,497,500000),B=36,C=COUNT
; CHECKSUM BYTE
; END;
;
; "<GET"> PORT LIST(0,500),B=36,P=EOF,CHECK
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(79),F=' ',D=0
; EXTENSION STRING(79),F=' ',D=0
; CREATIONDATE STRING(19),F=' ',D=0
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; COUNT BYTE
; DATA STRING(0,437,1000000),B=36,D=0
; CHECKSUM BYTE
; END;
;
; "<PUT"> PORT LIST(0,500),B=36,P=EOF,CHECK
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D=0
; EXTENSION STRING(0,3,79),D=0
; CREATIONDATE STRING(0,18,79),D=0
; SAVEDATE STRING(0,18,79),D=0
; VERSION INTEGER
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; COUNT BYTE
; DATA STRING(0,497,1000000),B=36,C=COUNT
; CHECKSUM BYTE
; END;
;
; "<TERSE"> PORT LIST(0,500),P=EOF
; FILE STRUCTURE,P=EOR
; PREFIX STRING(5),F=' '
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D='.'
; EXTENSION STRING(0,3,79),D=';'
; VERSION INTEGER(1,10),D=' '
; LENGTH INTEGER(1,10),D='('
; BYTESIZE INTEGER(1,10),D=')'
; END
; END;
;
; "<VERBOSE"> PORT LIST(0,500),P=EOF
; FILE STRUCTURE,P=EOR
; PREFIX STRING(5),F=' '
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D='.'
; EXTENSION STRING(0,3,79),D=';'
; VERSION INTEGER(1,10),D=' '
; STATUS STRING(1),D=' '
; CREATIONDATE STRING(1,18,79),D=' '
; SAVEDATE STRING(1,18,79),D=' '
; LENGTH INTEGER(1,10),D='('
; BYTESIZE INTEGER(1,10),D=')'
; END
; END;
; ***PROGRAM***
DFTP:
IFL F.TENX,<.SUSET [.RSNAME,,LCLSNM]>
IFE F.TENX,<JFCL>
IFGE F.TENX,<RESET>
MOVE STAK,[IOWD STSIZ,STBEG]
CALLR S$INIT
CALLR D$INIT
; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
IFL F.TENX,< ; HACK FOR ITS VERSION FOR AUTOENABLE
MOVEI UTIL,CMDM3
.OPEN ['DSK'
SIXBIT/←DFTP←/
SIXBIT/ENABLE/]
>
MOVEI UTIL,CMDM2 ; CAN ENABLE LATER ON
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
; (((ITS)))
IFL F.TENX,<
MOVEI UTIL,CMDM2
.SUSET [.RXUNAME,,X1]
.CALL [ SETZ
SIXBIT/OPEN/
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ X1]
MOVEI UTIL,CMDM1 ; NO ITS DIRECTORY
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
MOVEI UTIL,CMDM1
; (!ENABLE!)
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
MOVEI UTIL,CMDM1
MOVEI X1,400000 ; FOR THIS FORK
RPCAP
TRNE X2,600000 ; (1B18+1B19) WHEEL OR OPER
MOVEI UTIL,CMDM2
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<.CLOSE>
MOVEM UTIL,CMDMOD
JRST CMDCMD
CMDNEW: TSOUT <CRLF>
CMDCMD: JRST @CMDMOD
CMDM1: TSOUT <[ASCIZ/*/]>
TCIN (CMDMC1,[ASCIZ/*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM2: TSOUT <[ASCIZ/*/]>
TCIN (CMDMC2,[ASCIZ/*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM3: TSOUT <[ASCIZ/!/]>
TCIN (CMDMC3,[ASCIZ/!/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
CALO: PATH ([ASCIZ/ ALLOCATE /],PATHNR!PATHCA)
JRST CMDCMD
TSOUT <[ASCIZ/ [Megabits:/]>
TNIN ([ASCIZ/ [Megabits:/])
JRST CMDCMD
MOVEM IO,ABUF
JUMPN IO,CALO0
MOVEI IO,"0"
TBOUT <IO>
CALO0: TSOUT <[ASCIZ/]/],CRLF>
CALLR DALO
JRST CMDCMD
CATT: PATH ([ASCIZ/ ATTACH /],PATHNR!PATHCT)
JRST CMDCMD
CALLR DATT
JRST CMDCMD
CCHA: PATH ([ASCIZ/ CHANGE /],PATHNR!PATHCA!PATHAD)
JRST CMDCMD
CALLR DCHA
JRST CMDCMD
CCON: PATH ([ASCIZ/ CONNECT /],PATHNR!PATHCA!PATHAD)
JRST CMDCMD
CALLR DCON
JRST CMDCMD
CCRE: PATH ([ASCIZ/ CREATE /],PATHNR!PATHCA)
JRST CMDCMD
CALLR DCRE
JRST CMDCMD
CDEL: PATH ([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
JRST CMDCMD
CALLR DDEL
JRST CMDCMD
CDIR: PATH ([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
JRST CMDCMD
MOVE IO,CMDMOD
CAIN IO,CMDM3
JRST CDIR1
TSOUT <[ASCIZ/**/]>
TCIN (CDIRC,[ASCIZ/**/])
JRST CMDCMD
JRST CDIR2
JRST CDIR3
CDIR1: TSOUT <[ASCIZ/!!/]>
TCIN (CDIRC,[ASCIZ/!!/])
JRST CMDCMD
JRST CDIR2
JRST CDIR3
CDIR2: MOVEI FLAG,DD$T
TSOUT <[ASCIZ/TERSE/]>
CDIR3: TSOUT <CRLF>
CALLR DDIR
JRST CMDCMD
CDIRC: TCIL <TERSE,DD$T,VERBOSE,DD$V>
CDIS: TSOUT <CRLF>
MOVEI UTIL,CMDM2
MOVEM UTIL,CMDMOD
JRST CMDCMD
CENA: TSOUT <CRLF>
MOVEI UTIL,CMDM3
MOVEM UTIL,CMDMOD
JRST CMDCMD
; (((TENEX)))
IFG F.TENX,<
CEXE: HRROI X1,CRLF
PSOUT
HRRZI X1,-1
RFMOD
MOVE R10,X2
RFCOC
MOVE R11,X2
MOVE R12,X3
HRLZI X1,(1B1) ; INFERIOR GETS THIS FORK'S CAPABILITIES
CFORK ; CREATE FORK
THUD
MOVE UTIL,X1
HRLZI X1,(1B2+1B17)
HRROI X2,[ASCIZ/<SYSTEM>EXEC.SAV/]
GTJFN
THUD
HRLI X1,(UTIL)
GET ; LOAD EXEC INTO FORK
MOVE X1,UTIL
SETZ X2,
SFRKV ; START FORK AT MAIN STARTUP
WFORK
KFORK
HRRZI X1,-1
MOVE X2,R10
SFMOD
MOVE X2,R11
MOVE X3,R12
SFCOC
JRST CMDCMD
>
; (((↑↑↑)))
CEXP: PATH ([ASCIZ/ EXPUNGE /],PATHNR!PATHCC!PATHAD!PATHAC)
JRST CMDCMD
CALLR DEXP
JRST CMDCMD
CGET: PATH ([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CLIN: TSOUT <CRLF>
CALLR DLIN
JRST CMDCMD
CLIS: PATH ([ASCIZ/ LIST /],PATHNR!PATHCC!PATHAS)
JRST CMDCMD
MOVE IO,CMDMOD
CAIN IO,CMDM3
JRST CLIS1
TSOUT <[ASCIZ/**/]>
TCIN (CLISC1,[ASCIZ/**/])
JRST CMDCMD
JRST CLIS2
JRST CLIS3
CLIS1: TSOUT <[ASCIZ/!!/]>
TCIN (CLISC2,[ASCIZ/!!/])
JRST CMDCMD
JRST CLIS2
JRST CLIS3
CLIS2: MOVEI FLAG,DL$T
TSOUT <[ASCIZ/TERSE/]>
CLIS3: TSOUT <CRLF>
CALLR DLIS
JRST CMDCMD
CLISC1: TCIL <TERSE,DL$T,VERBOSE,DL$V>
CLISC2: TCIL <PROTECTION,DL$P,TERSE,DL$T,VERBOSE,DL$V>
; (((TOPS-10)))
IFE F.TENX,<
CLOD: TTCALL 3,CRLF
SETZM LUTDSP
CLOD1: CALLR LUTDS
JRST CMDCMD
TTCALL 1,[" "]
TTCALL 3,LUTDSF
TTCALL 3,CRLF
JRST CLOD1
>
; (((↑↑↑)))
CNOD: SETZM FLAGDD
JRST CMDNEW
CPUT: PATH ([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CQUI: TAIN <[ASCIZ/ [Confirm]/]>
JRST CMDCMD
JRST CMDCMD
JRST QUIT
CREM: PATH ([ASCIZ/ REMOVE /],PATHNR!PATHCC!PATHAS!PATHAC)
JRST CMDCMD
CALLR DREM
JRST CMDCMD
CRET: PATH ([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CSOD: SETOM FLAGDD
JRST CMDNEW
CSTO: PATH ([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CTTR: SETOM FLAGTT
JRST CMDNEW
CUND: PATH ([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
JRST CMDCMD
CALLR DUND
JRST CMDCMD
CUTR: SETZM FLAGTT
JRST CMDNEW
; ***PATH INPUT AND TRANSLATION***
; FLAG DEFINITIONS
PATHNR==400000 ; NODE REQUIRED
PATHNP==200000 ; NODE POSSIBLE
PATHNF==100000 ; NODE FOUND
PATHFR==040000 ; FILE REQUIRED
PATHFF==020000 ; FILE FOUND
PATHCT==004000 ; CONTEXT TOP
PATHCA==002000 ; CONTEXT ATTACH
PATHCC==001000 ; CONTEXT CONNECT
PATHLR==000400 ; LOCAL TO REMOTE
PATHRL==000200 ; REMOTE TO LOCAL
PATHAS==000040 ; ALLOW SETS
PATHAD==000020 ; ALLOW (NON-SET) DEFAULT
PATHAV==000010 ; ALLOW VERSIONS
PATHAC==000004 ; ACKNOWLEDGE [CONFIRM]
; PATH INPUT CONTROL
; IN: TCIO -- LAST CHARACTER INPUT (TCIN)
; FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$: BEGINR <IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
TLNE FLAG,PATHLR
TLO FLAG,PATHAV
>
; (((↑↑↑)))
MOVEI IO," "
TBOUT <IO>
MOVE IO,[GBUF1,,5*LBSIZE]
SETZ UTIL,
CALLR P$IN
RETURN
PUSH STAK,IO
MOVE IO,[GBUF1,,NBUF]
MOVE UTIL,[FBUF,,EBUF]
CALLR P$PP
POP STAK,IO
MOVEM UTIL,VBUF
TLNN FLAG,PATHAC
JRST PAT$10
TAIN <[ASCIZ/ [Confirm]/]>
RETURN
RETURN
RETURN SKIP,1
PAT$10: TLNE FLAG,PATHRL!PATHLR
JRST PAT$11
TSOUT <CRLF>
RETURN SKIP,1
PAT$11: PUSH STAK,IO
MOVE IO,[FBUF,,EBUF]
; (((TENEX)))
IFG F.TENX,<
TLNE FLAG,PATHRL
SETZ UTIL,
>
; (((↑↑↑)))
CALLR P$LF
POP STAK,IO
CAIN IO,33
JRST PAT$20
CAIN IO," "
JRST PAT$20
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$12: TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$12: SKIPE LJFN
JRST .+3
HRROI X1,CRLF
PSOUT
>
; (((↑↑↑)))
RETURN SKIP,1
PAT$20: TLNE FLAG,PATHLR
JRST PAT$21
TLNE FLAG,PATHRL
JRST PAT$22
JRST PAT$23
PAT$21: TLNE FLAG,PATHNF
JRST PAT$12
; (((TENEX)))
IFG F.TENX,<
TLZ FLAG,PATHAV
>
; (((↑↑↑)))
JRST PAT$23
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$22: TLZ FLAG,PATHNR!PATHNP!PATHAV
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$22: SKIPN LJFN
JRST .+4
HRROI X1,CRLF
PSOUT
RETURN SKIP,1
TLZ FLAG,PATHNR!PATHNP
>
; (((↑↑↑)))
PAT$23: TSOUT <[ASCIZ/ [As] /]>
MOVE IO,[GBUF2,,5*LBSIZE]
MOVE UTIL,[GBUF1,,[ASCIZ/ [As] /]]
CALLR P$IN
RETURN
TLNE FLAG,PATHLR
JRST PAT$24
TLNE FLAG,PATHRL
JRST PAT$25
RETURN
PAT$24: MOVE IO,[GBUF2,,NBUF]
MOVE UTIL,[FBUF,,EBUF]
CALLR P$PP
MOVEM UTIL,VBUF
TSOUT <CRLF>
RETURN SKIP,1
PAT$25: MOVE IO,[GBUF2,,GBUF1]
MOVE UTIL,[FSBUF,,ESBUF]
CALLR P$PP
MOVE IO,[FSBUF,,ESBUF]
CALLR P$LF
; (((TOPS-10+ITS)))
IFLE F.TENX,<
TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
SKIPE LJFN
JRST .+3
HRROI X1,CRLF
PSOUT
>
; (((↑↑↑)))
ENDR SKIP,1
; PATH INPUT
; IN: IO -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
; UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
; FLAG -- (SAME AS $PATH$)
; OUT: IO -- LAST CHARACTER INPUT
; UTIL -- COUNT OF CHARACTERS
; FLAGS:
P$I$AE==400000 ; ANCHOR ENCOUNTERED (<)
P$I$DE==200000 ; DESCENDER ENCOUNTERED (>,.)
P$I$SE==100000 ; SET ENCOUNTERED (*)
P$I$TE==040000 ; TRAILING NODE SET ENCOUNTERED (**)
P$I$PW==010000 ; INPUT PASSWORD
P$I$CC==004000 ; <
P$I$CA==002000 ; <<
P$I$CT==001000 ; <<<
P$I$EP==000400 ; EXTENSION BEING PROCESSED
P$I$VP==000200 ; VERSION BEING PROCESSED
;
P$IN: BEGINR <BP,R10,R11,R12,R13>
SETZ R10,
MOVE R11,IO
MOVE R12,UTIL
HLR BP,IO
HRLI BP,(POINT 7,)
SETZ UTIL,
P$ICHR: TBIN <IO>
CAIN IO,"R"-100
JRST P$IREP
CAIN IO,"A"-100
JRST P$IDEL
CAIN IO,"X"-100
JRST P$IENR
CAIN IO,177
JRST P$IENR
CAIN IO,15
JRST P$ICHR
CAIN IO,12
JRST P$IEND
CAIN IO,33
JRST P$IEND
CAIN IO,37
JRST P$IEND
CAIGE IO," "
JRST P$IBAD
CAIN IO,42
JRST P$IBAD
TRNE R10,P$I$TE
JRST P$IBAD
CAIL UTIL,(R11)
JRST P$IBAD
TRNE R10,P$I$PW
JRST P$ICHP
CAIN IO," "
JRST P$IEND
CAIN IO,"?"
JRST P$IBAD
CAIN IO,"*"
JRST P$ISS
TRNE R10,P$I$VP
JRST P$ISVN
CAIN IO,";"
JRST P$ISVS
CAIN IO,":"
JRST P$IPON
CAIN IO,"<"
JRST P$ISA
CAIN IO,">"
JRST P$ISD1
CAIN IO,"."
JRST P$ISD2
TRNE R10,P$I$SE
JRST P$IBAD
TRZ R10,P$I$AE!P$I$DE
P$ICHE: IDPB IO,BP
TBOUT <IO>
AOJA UTIL,P$ICHR
P$ICHP: CAIN IO,">"
JRST P$IPOF
CAIN IO,"'"
JRST P$IBAD
IDPB IO,BP
AOJA UTIL,P$ICHR
P$ISA: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
TRNN R10,P$I$CC
JRST P$ISA1
TRNN R10,P$I$CA
JRST P$ISA2
TRNN R10,P$I$CT
JRST P$ISA3
JRST P$IBAD
P$ISA1: JUMPN UTIL,P$IBAD
TRO R10,P$I$AE!P$I$CC
JRST P$ICHE
P$ISA2: CAIE UTIL,1
JRST P$IBAD
TRO R10,P$I$AE!P$I$CA
JRST P$ICHE
P$ISA3: CAIE UTIL,2
JRST P$IBAD
TRO R10,P$I$AE!P$I$CT
JRST P$ICHE
P$ISD1: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$EP
JRST P$IBAD
TLNN FLAG,PATHFR
JRST .+3
TRNE R10,P$I$SE
JRST P$IBAD
TROE R10,P$I$DE
JRST P$IBAD
TRZ R10,P$I$SE
JRST P$ICHE
P$ISD2: TLNN FLAG,PATHFR
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$DE!P$I$EP
JRST P$IBAD
TRZ R10,P$I$SE
TRO R10,P$I$DE!P$I$EP
JRST P$ICHE
P$ISVS: TLNN FLAG,PATHAV
JRST P$IBAD
TLNN FLAG,PATHFR
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$VP
JRST P$IBAD
TRNN R10,P$I$DE
JRST .+3
TRNN R10,P$I$EP
JRST P$IBAD
TRZ R10,P$I$SE!P$I$EP
TRO R10,P$I$VP!P$I$DE
JRST P$ICHE
P$ISVN: CAIL IO,"0"
CAILE IO,"9"
JRST P$IBAD
TRNE R10,P$I$SE
JRST P$IBAD
TRZ R10,P$I$DE
JRST P$ICHE
P$ISS: TLNN FLAG,PATHAS
JRST P$IBAD
TRNE R10,P$I$SE
JRST P$IST
TRZN R10,P$I$AE!P$I$DE
JUMPN UTIL,P$IBAD
TRO R10,P$I$SE
JRST P$ICHE
P$IST: TLNE FLAG,PATHFR
JRST P$IBAD
TRNE R10,P$I$EP!P$I$VP
JRST P$IBAD
TRO R10,P$I$TE
JRST P$ICHE
P$IPON: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
TRNE R10,P$I$AE!P$I$DE!P$I$SE
JRST P$IBAD
MOVEI X1,1(UTIL)
CAIL X1,(R11)
JRST P$IBAD
IDPB IO,BP
TBOUT <IO>
MOVEI X1,"P"-100
IDPB X1,BP
ADDI UTIL,2
TRO R10,P$I$PW
JRST P$ICHR
P$IPOF: MOVEI X1,1(UTIL)
CAIL X1,(R11)
JRST P$IBAD
MOVEI X1,"P"-100
IDPB X1,BP
IDPB IO,BP
TBOUT <IO>
ADDI UTIL,2
TRZ R10,P$I$PW
TRO R10,P$I$DE
JRST P$ICHR
P$IBAD: MOVEI IO,"G"-100
TBOUT <IO>
JRST P$ICHR
P$IREP: TSOUT <CRLF>
TSOUT <(FLAG)>
JUMPE R12,P$IR04
HLR R13,R12
HRLI R13,(POINT 7,)
TRZ R10,P$I$PW
P$IR01: ILDB IO,R13
JUMPE IO,P$IR03
CAIN IO,"P"-100
JRST P$IR02
TRNE R10,P$I$PW
JRST P$IR01
TBOUT <IO>
JRST P$IR01
P$IR02: TRC R10,P$I$PW
JRST P$IR01
P$IR03: TSOUT <(R12)>
P$IR04: HRRZI IO,(BP)
HLR R13,R11
CAIGE IO,(R13)
JRST P$ICHR
HRLI R13,(POINT 7,)
TRZ R10,P$I$PW
P$IR05: CAMN R13,BP
JRST P$ICHR
ILDB IO,R13
CAIN IO,"P"-100
JRST P$IR06
TRNE R10,P$I$PW
JRST P$IR05
TBOUT <IO>
JRST P$IR05
P$IR06: TRC R10,P$I$PW
JRST P$IR05
P$IDEL: JUMPE UTIL,P$IBAD
MOVEI IO,"\"
TBOUT <IO>
LDB IO,BP
SOJ BP,
IBP BP
IBP BP
IBP BP
IBP BP
CAIN IO,"P"-100
JRST P$ID01
LDB X1,BP
CAIN X1,"P"-100
JRST P$ID02
TRNE R10,P$I$PW
SOJA UTIL,P$ICHR
TBOUT <IO>
TRZ R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
CAIN IO,"."
TRZ R10,P$I$EP
CAIN IO,";"
TRZ R10,P$I$VP
CAIE IO,"<"
JRST P$ID00
TRZE R10,P$I$CT
JRST P$ID00
TRZE R10,P$I$CA
JRST P$ID00
TRZ R10,P$I$CC
P$ID00: SUBI UTIL,1
JUMPE UTIL,P$ICHR
LDB X1,BP
CAIN X1,"<"
TRO R10,P$I$AE
CAIN X1,">"
TRO R10,P$I$DE
CAIN X1,"."
TRO R10,P$I$DE
CAIN X1,";"
TRO R10,P$I$DE
CAIN X1,"*"
TRO R10,P$I$SE
JRST P$ICHR
P$ID01: TRZ R10,P$I$PW
LDB IO,BP
JRST P$ID03
P$ID02: TROE R10,P$I$PW
SOJA UTIL,P$ICHR
TRZ R10,P$I$DE
P$ID03: SOJ BP,
IBP BP
IBP BP
IBP BP
IBP BP
TBOUT <IO>
SUBI UTIL,2
JRST P$ICHR
P$IENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETO IO,
SETZ UTIL,
RETURN
P$IEND: CAIN IO,12
JRST P$IENL
CAIN IO,37
JRST P$IENL
TLNN FLAG,PATHAS
JRST P$IENV
JUMPE UTIL,P$IENV
LDB R13,BP
CAIN R13,">"
JRST P$IENT
TLNN FLAG,PATHFR
JRST P$IENV
TLNE FLAG,PATHAS
JRST P$IENV
TRNE R10,P$I$AE
JRST P$IBAD
JRST P$IENV
P$IENL: TLNN FLAG,PATHFR
JRST P$IENV
TRNE R10,P$I$AE
JRST P$IBAD
P$IENV: TRNN R10,P$I$DE
JRST .+3
TRNN R10,P$I$EP
JRST P$IBAD
; (((TENEX)))
IFG F.TENX,<
TLNN FLAG,PATHFR
JRST P$IE$4
TLNN FLAG,PATHLR!PATHRL
JRST P$IE$4
JUMPN UTIL,P$IE$4
CAIG R12,-1
JRST .+3
TLNE FLAG,PATHLR
JRST P$IBAD ; PUT -- SECOND ARGUMENT
MOVEI X1,76
PBOUT
TLNE FLAG,PATHLR
HRLZI X1,160103 ; OLD,MSG,CONFIRM,JFN,SHORT
TLNE FLAG,PATHRL
HRLZI X1,660043 ; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
MOVE X2,[100,,101]
GTJFN
JRST P$IENR
MOVEM X1,LJFN
HRROI X1,LFILE
MOVE X2,LJFN
SETZ X3,
JFNS
MOVEI X1,100
BKJFN
THUD
PBIN
MOVEI IO,(X1)
CAILE R12,-1 ; GET SECOND ARGUMENT
JRST P$IE$1
TLNN FLAG,PATHLR ; PUT FIRST ARGUMENT
JRST .+5
CAIN IO,33
JRST P$IE$1
CAIN IO," "
JRST P$IE$1
HLRO X1,R11
MOVE X2,LJFN
MOVE X3,[002200,,000001]
JFNS
LDB X2,X1
CAIE X2,"."
JRST P$IE$1
SETZ X2,
DPB X2,X1
P$IE$1: HRROI X1,FSBUF
MOVE X2,LJFN
HRLZI X3,002000
JFNS
LDB X1,[350700,,FSBUF]
CAIN X1,"*"
SETOM FSBUF
HRROI X1,ESBUF
HRLZI X3,000200
JFNS
LDB X1,[350700,,ESBUF]
CAIN X1,"*"
SETOM ESBUF
CAIN X1,0
SETZM ESBUF
TLNN X2,017000
JRST P$IE$2
TLNE X2,010000
SETOM VSBUF
TLNE X2,007000
SETZM VSBUF
JRST P$IE$3
P$IE$2: HRROI X1,UBUF1
HRLZI X3,000020
JFNS
HRROI X1,UBUF1
MOVEI X3,↑D10
NIN
SETZ X2,
MOVEM X2,VSBUF
P$IE$3: HRRZ X1,LJFN
RLJFN
THUD
MOVEI UTIL,-1(R11)
CAIN IO,12
SETOM LJFN
CAIN IO,37
SETOM LJFN
RETURN SKIP,1
P$IE$4: CAIG R12,-1
JRST .+3
TLNE FLAG,PATHLR
JRST .+3
SETZM LFILE
SETZM LJFN
>
; (((↑↑↑)))
JUMPN UTIL,P$IENN
TLNN FLAG,PATHAS
JRST P$IENC
MOVE R12,[POINT 7,[ASCIZ/**/]]
TLNN FLAG,PATHFR
JRST P$IENS
HRRI R12,[ASCIZ/*.*/]
TLNE FLAG,PATHAV
HRRI R12,[ASCIZ/*.*;*/]
JRST P$IENS
P$IENC: TLNN FLAG,PATHAD
JRST P$IBAD
MOVE R12,[POINT 7,[ASCIZ/<</]]
TLNE FLAG,PATHCC
HRRI R12,[ASCIZ/</]
JRST P$IENS
P$IENN: TLNN FLAG,PATHAS
JRST P$IENZ
TRNE R10,P$I$EP!P$I$VP
JRST P$IENZ
TLNN FLAG,PATHFR
JRST .+3
TRNN R10,P$I$AE!P$I$DE
JRST P$IENZ
CAIN IO,12
JRST P$IENZ
CAIN IO,37
JRST P$IENZ
LDB R13,BP
CAIN R13,"<"
JRST P$IENT
MOVEI R13,">"
IDPB R13,BP
TBOUT <R13>
ADDI UTIL,1
P$IENT: MOVE R12,[POINT 7,[ASCIZ/**/]]
TLNN FLAG,PATHFR
JRST P$IENS
HRRI R12,[ASCIZ/*.*/]
TLNE FLAG,PATHAV
HRRI R12,[ASCIZ/*.*;*/]
P$IENS: ILDB R13,R12
IDPB R13,BP
JUMPE R13,RETN(1)
TBOUT <R13>
AOJA UTIL,P$IENS
P$IENZ: SETZ R13,
IDPB R13,BP
ENDR SKIP,1
; P$PP -- PROCESS PATH (NODES AND FILES)
; IN: IO -- SOURCE,,NODE DESTINATION
; UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
; FLAG -- PATH CONTEXT FLAGS
; OUT: FLAG -- FOUND FLAGS
; UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP: BEGINR <BP>
TLNE FLAG,PATHNR
JRST P$PN
HLR BP,IO
HRLI BP,(POINT 7,)
TLNN FLAG,PATHNP
JRST P$PF0
SETZM (IO)
MOVE X1,BP
MOVE X2,BP
P$PS1: ILDB X3,BP
CAIN X3,"<"
JRST P$PS2
CAIN X3,">"
JRST P$PS2
CAIN X3,"."
JRST P$PS3
CAIN X3,";"
JRST P$PS3
JUMPE X3,P$PS3
JRST P$PS1
P$PS2: MOVE X2,BP
JRST P$PS1
P$PS3: MOVE BP,X2
CAMN BP,X1
JRST P$PF
TLO FLAG,PATHNF
MOVE X1,BP
LDB X2,X1
CAIN X2,"<"
ILDB X2,X1
SETZ X3,
DPB X3,X1
PUSH STAK,X1
PUSH STAK,X2
CALLR P$CP
POP STAK,X2
POP STAK,X1
DPB X2,X1
JRST P$PF
P$PN: TLO FLAG,PATHNF
CALLR P$CP
RETURN
P$PF: SKIPE (IO)
JRST P$PF0
MOVE X1,[POINT 7,CONTEX]
MOVE X2,[POINT 7,NBUF]
SCOPY (X1,X2)
P$PF0: TLO FLAG,PATHFF
SETZM (UTIL)
HLR X1,UTIL
HRLI X1,(POINT 7,)
P$PF1: ILDB X2,BP
IDPB X2,X1
JUMPE X2,P$PF3
CAIN X2,";"
JRST P$PF4
CAIE X2,"."
JRST P$PF1
SETZ X2,
DPB X2,X1
HRRI X1,(UTIL)
HRLI X1,(POINT 7,)
P$PF2: ILDB X2,BP
IDPB X2,X1
CAIN X2,";"
JRST P$PF4
JUMPN X2,P$PF2
P$PF3: SETZ UTIL,
RETURN
P$PF4: SETZ X2,
DPB X2,X1
ILDB X2,BP
CAIE X2,"*"
JRST P$PF5
SETO UTIL,
RETURN
P$PF5: SETZ UTIL,
P$PF6: SUBI X2,"0"
IMULI UTIL,↑D10
ADDI UTIL,(X2)
ILDB X2,BP
JUMPN X2,P$PF6
ENDR
; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
; IN: IO -- SOURCE,,DESTINATION
; FLAG -- PATH CONTEXT FLAGS
;
P$CP: BEGINR <IO,FLAG>
MOVEI X1,<<LBSIZE*5>-1>
HLR X2,IO
HRLI X2,350700
HRRI X3,(IO)
HRLI X3,(POINT 7,)
LDB IO,X2
CAIN IO,"<"
JRST P$CPCX
TLNE FLAG,PATHCT
JRST P$CPCT
TLNE FLAG,PATHCA
JRST P$CPCA
JRST P$CPCC
P$CPCX: ILDB IO,X2
CAIE IO,"<"
JRST P$CPCC
ILDB IO,X2
CAIE IO,"<"
JRST P$CPCA
ILDB IO,X2
P$CPCT: MOVE X4,[POINT 7,[ASCIZ/%TOP./]]
SCOPY (X4,X3)
MOVE X4,[POINT 7,ANCHOR]
SCOPY (X4,X3)
SUBI X1,11
JRST P$CPCE
P$CPCA: MOVE X4,[POINT 7,[ASCIZ/%LOGIN/]]
SCOPY (X4,X3)
SUBI X1,6
JRST P$CPCE
P$CPCC: MOVE X4,[POINT 7,CONTEX]
ILDB 0,X4
JUMPE 0,.+4
SOJL X1,P$CPE
IDPB 0,X3
JRST .-4
MOVE X4,X3
IDPB 0,X4
P$CPCE: JUMPE IO,P$CPZ0
MOVEI X4,"."
IDPB X4,X3
SUBI X1,1
MOVEI X4,42
SETZ FLAG,
JRST P$CPI0
P$CPI: ILDB IO,X2
P$CPI0: CAIN IO,"P"-100
JRST P$CPI
CAIN IO,">"
JRST P$CPS
JUMPE IO,P$CPZ
JUMPN FLAG,P$CPO
CAIN IO,":"
JRST P$CPP
CAIN IO,"*"
JRST P$CPO
CAIGE IO,"A"
JRST P$CPQ
CAILE IO,"Z"
JRST P$CPQ
P$CPO: SOJL X1,P$CPE
IDPB IO,X3
JRST P$CPI
P$CPQ: SOJL X1,P$CPE
IDPB X4,X3
JRST P$CPO
P$CPS: JUMPE FLAG,.+6
MOVEI IO,"'"
IDPB IO,X3
MOVEI IO,")"
IDPB IO,R3
SETZ FLAG,
MOVEI IO,"."
JRST P$CPO
P$CPP: SUBI X1,4
JUMPL X1,P$CPE
MOVEI IO,"("
IDPB IO,R3
MOVEI IO,"'"
IDPB IO,R3
SETO FLAG,
JRST P$CPI
P$CPE: TSOUT <[ASCIZ/ (Pathname too long.)/],CRLF>
MOVE STAK,[IOWD STSIZ,STBEG]
JRST CMDCMD
P$CPZ: JUMPE FLAG,.+5
MOVEI X1,"'"
IDPB X1,X3
MOVEI X1,")"
IDPB X1,X3
P$CPZ0: IDPB IO,X3
ENDR
; LOCAL FILE NAME PREPARATION
; IN: IO -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF: BEGINR <IO>
; (((TENEX)))
IFG F.TENX,<
SKIPE LFILE
RETURN
>
; (((↑↑↑)))
HLL X1,IO
HRRI X1,FSBUF
BLT X1,<FSBUF+SBSIZE-1>
LDB X1,[350700,,FSBUF]
CAIN X1,"*"
SETOM FSBUF
HRLI X1,(IO)
HRRI X1,ESBUF
BLT X1,<ESBUF+SBSIZE-1>
LDB X1,[350700,,ESBUF]
CAIN X1,"*"
SETOM ESBUF
CAIN X1,0
SETZM ESBUF
HLR X1,IO
HRLI X1,(POINT 7,)
MOVE X2,[POINT 7,ABUF]
ILDB X3,X1
IDPB X3,X2
JUMPN X3,.-2
SKIPN (IO)
JRST .+8
MOVEI X3,"."
DPB X3,X2
HRRI X1,(IO)
HRLI X1,(POINT 7,)
ILDB X3,X1
IDPB X3,X2
JUMPN X3,.-2
; (((TOPS-10+ITS)))
IFLE F.TENX,<
HRRZI IO,ABUF
CALLR LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
MOVEM UTIL,VSBUF
JUMPE UTIL,P$LFX1
MOVEI X3,";"
DPB X3,X2
JUMPG UTIL,P$LFX0
MOVEI X3,"*"
IDPB X3,X2
SETZ X3,
IDPB X3,X2
JRST P$LFX1
P$LFX0: MOVE X1,X2
MOVE X2,UTIL
MOVEI X3,↑D10
NOUT
THUD
P$LFX1: MOVE IO,[ABUF,,LFILE]
BLT IO,<LFILE+SBSIZE-1>
>
; (((↑↑↑)))
ENDR
; ***DATACOMPUTER INTERFACE ROUTINES***
; DALO -- ALLOCATE SPACE
;
DALO: BEGINR
DCSOUT <[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
MOVE IO,ABUF
DCNOUT <IO>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
ENDR
; DATT -- LOGIN TO NODE
;
DATT: BEGINR
DCSOUT <[ASCIZ/LOGIN /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVE X1,[ASCII/%LOGI/]
MOVEM X1,CONTEX
MOVE X1,[ASCII/N/]
MOVEM X1,<CONTEX+1>
SKIPN OPENED
RETURN
SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
RETURN
ENDR
; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA: BEGINR <IO,UTIL>
DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCHAD: DCSOUT <[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST DCHAD
TSOUT <[ASCIZ/ [Ok]/],CRLF>
DCHAI: TAIN <[ASCIZ/ Add a new privilege? /]>
RETURN
RETURN
SETZM ABUF ; WRITE FLAG
SETZM <ABUF+1> ; HOST
SETZM <ABUF+2> ; SOCKET
SETOM <ABUF+3> ; PASSWORD
TAIN <[ASCIZ/ Allow control? /]>
JRST DCHAI
SETOM ABUF
TAIN <[ASCIZ/ Restrict via network? /]>
JRST DCHAI
JRST DCHAI5
TAIN <[ASCIZ/ Restrict via local host? /]>
JRST DCHAI
JRST DCHAI1
MOVE IO,LHOST
JRST DCHAI2
DCHAI1: TSOUT <[ASCIZ/ Host number (octal): /]>
TNIN ([ASCIZ/ Host number (octal): /],10)
JRST DCHAI
TSOUT <CRLF>
DCHAI2: MOVEM IO,<ABUF+1>
TAIN <[ASCIZ/ Restrict via user? /]>
JRST DCHAI
JRST DCHAI5
MOVE IO,LHOST
CAMN IO,<ABUF+1>
JRST DCHAI3
TSOUT <[ASCIZ/ Socket number (octal): /]>
TNIN ([ASCIZ/ Socket number (octal): /],10)
JRST DCHAI
JRST DCHAI4
DCHAI3:
; (((NOT ITS)))
IFGE F.TENX,<
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)
IFE F.SAIL,<
TSOUT <[ASCIZ/ User: /]>
TNIN ([ASCIZ/ User: /],10)
JRST DCHAI
LSH IO,11
ADDI IO,100
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
TSOUT <[ASCIZ/ User: /]>
TSIN (UBUF1,LBSIZE,[ASCIZ/ User: /])
JRST DCHAI
SETZ X1,
MOVE X2,[POINT 7,UBUF1]
STDIR
JRST .+3
JRST .+2
JRST .+4
HRROI X1,[ASCIZ/ (User not found.)
/]
PSOUT
JRST DCHAI
HRRZI IO,(X1)
LSH IO,↑D15
ADDI IO,20
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<SETZM ABUF+2
JRST DCHAI5>
IFN F.SAIL,<SETZM <ABUF+2>
JRST DCHAI5>
DCHAI4: MOVEM IO,<ABUF+2>
TSOUT <CRLF>
DCHAI5: TAIN <[ASCIZ/ Restrict via password? /]>
JRST DCHAI
JRST DCHAC
TSOUT <[ASCIZ/ Password: /]>
TSIN (<ABUF+3>,<SBSIZE-3>,[ASCIZ/ Password: /])
JRST DCHAI
TSOUT <CRLF>
DCHAC: DCSOUT <[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
SKIPE ABUF
JRST DCHAC1
DCSOUT <[ASCIZ/CWA/]>
DCHAC1: SKIPN <ABUF+1>
JRST DCHAC3
DCSOUT <<[ASCIZ/,H=/]>>
MOVE IO,<ABUF+1>
DCNOUT <IO>
DCSOUT <<[ASCIZ/,S=/]>>
MOVE IO,<ABUF+2>
JUMPE IO,DCHAC2
DCNOUT <IO>
JRST DCHAC3
DCHAC2: DCSOUT <[ASCIZ/ANY/]>
DCHAC3: SETO IO,
CAMN IO,<ABUF+3>
JRST DCHAC4
DCSOUT <<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4: DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
TSOUT <[ASCIZ/ [OK]/],CRLF>
JRST DCHAI
ENDR
; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON: BEGINR
DCSOUT <[ASCIZ/LIST /],NBUF,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST DCON1
TSOUT <[ASCIZ/ [Old Node]/],CRLF>
JRST DCON2
RETURN
DCON1: TAIN <[ASCIZ/ [New Node][Confirm]/]>
RETURN
RETURN
DCSOUT <[ASCIZ/CREATE /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCON2: MOVE X1,[POINT 7,NBUF]
MOVE X2,[POINT 7,CONTEX]
SCOPY (X1,X2)
ENDR
; DCRE -- CREATE NEW NODE
;
DCRE: BEGINR
DCSOUT <[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
MOVEI IO,DEFALO
DCNOUT <IO>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
CALLR DCHA
ENDR
; DDEL -- DELETE FILES
;
DDEL: BEGINR <IO>
SETZ IO,
CALLR D$OPEN
RETURN
SETO IO,
CALLR D$VER
RETURN
DCSOUT <[ASCIZ/BEGIN
DECLARE DELETED INTEGER
DELETED=0
UPDATE FILES IN "<FILES">/]>
HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
CALLR D$WITH
DCSOUT <DDELS>
SETOM FLAGDE
CALLR RENDEM
RETURN
CALLR RENDER
RETURN
ENDR
DDELS: ASCIZ/
BEGIN
STATUS='D'
DELETED=DELETED+1
COMMENT FILES.FILE.HEADER.FILENAME
! '.' ! FILES.FILE.HEADER.EXTENSION
! ';' ! FILES.FILE.HEADER.VERSION
END
IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
END;
/
; DDIR -- FILE DIRECTORY
; IN: FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR: BEGINR <IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
SETZM FLAGCO
>
; (((↑↑↑)))
SETO IO,
CALLR D$OPEN
RETURN
SKIPN VBUF
SETOM VBUF
SETZ UTIL,
CAIN FLAG,DD$T
JRST DDIRO1
CAIN FLAG,DD$V
JRST DDIRO2
RETURN
DDIRO1: DCSOUT <[ASCIZ/"<TERSE">="<FILES">/]>
HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
JRST DDIRO3
DDIRO2: DCSOUT <[ASCIZ/"<VERBOSE">="<FILES">/]>
SETZ IO,
DDIRO3: CALLR D$WITH
DCSOUT <SEMI>
MOVE IO,[ASCII/.I241/]
CALLR RENFIP
RETURN
CALLR RENLIN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRF: CALLR RENPRE
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRF: SKIPN FLAGCO
JRST DDIRF0
HRROI X1,[ASCIZ/ [Aborting]
/]
PSOUT
MOVE X1,DCOJFN
MOVEI X2,22
MTOPR
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <SEMI>
SETZM FLAGDE
CALLR RENDER
RETURN
RETURN
DDIRF0: CALLR RENPRE
>
; (((↑↑↑)))
CAMN IO,[ASCII/ /]
JRST DDIRF1
CAMN IO,[ASCII/.I261/]
JRST DDIRF2
CALLR RENLIP
SETZM FLAGDE
CALLR RENDER
RETURN
RETURN
DDIRF1: CALLR <(FLAG)>
AOJA UTIL,DDIRF
DDIRF2: CALLR RENLIN
SETOM FLAGDE
CALLR RENDER
RETURN
JUMPN UTIL,RETN(0)
TSOUT <[ASCIZ/ [No Files]/],CRLF>
ENDR
; DD$T -- TERSE FILES
;
DD$T: BEGINR <IO>
SKIPE FLAGDD
JRST DD$T1
MOVEI IO,11
TBOUT <IO>
DD$T1: DCBIN <IO>
SKIPE FLAGDD
JRST DD$T2
TBOUT <IO>
DD$T2: CAIE IO,12
JRST DD$T1
ENDR
; DD$V -- VERBOSE FILES
;
DD$V: BEGINR <IO>
SKIPE FLAGDD
JRST DD$V1
MOVEI IO,11
TBOUT <IO>
DD$V1: DCBIN <IO>
SKIPE FLAGDD
JRST DD$V3
CAIN IO,11
JRST DD$V2
TBOUT <IO>
JRST DD$V3
DD$V2: TSOUT <CRLF>
TBOUT <IO>
TBOUT <IO>
JRST DD$V1
DD$V3: CAIE IO,12
JRST DD$V1
ENDR
; DEXP -- EXPUNGE
;
DEXP: BEGINR <IO>
DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
CALLR RENPRE
CALLR RENLIN
CAMN IO,[ASCII/.I280/]
JRST DEXP1
TSOUT <[ASCIZ/ (There are no <FILES>.)/],CRLF>
JRST DEXP3
JRST DEXP3
DEXP1: DCBIN <IO>
CAIE IO,12
JRST DEXP2
DCBIN <IO>
CAIN IO," "
JRST DEXP2
CALLR RENLIN
JRST DEXP3
DEXP2: CAIE IO," "
JRST DEXP1
DCBIN <IO>
CAIE IO,"R"
JRST DEXP1
DCBIN <IO>
CAIE IO,"E"
JRST DEXP1
DCBIN <IO>
CAIE IO,"C"
JRST DEXP1
DCBIN <IO>
CAIE IO,"S"
JRST DEXP1
DCBIN <IO>
CAIE IO,"="
JRST DEXP1
CALLR DCNIN
CALLR RENLIN
SETZM FLAGDE
CALLR RENDER
JRST .+1
JUMPN IO,DEXP4
DCSOUT <[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
SKIPN OPENED
RETURN
SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
DEXP3: SETZM FLAGDE
CALLR RENDER
RETURN
RETURN
DEXP4: SETZ IO,
CALLR D$OPEN
RETURN
DCSOUT <[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
ENDR
; DGET -- GET-RETRIEVE
;
DGET: BEGINR <IO,FLAG>
; (((TENEX)))
IFG F.TENX,<
GJINF
CAME X2,LDIR
CALLR D$CON
>
; (((↑↑↑)))
SETZ FLAG,
SETO IO,
CALLR D$OPEN
RETURN
SKIPLE VBUF
JRST DGET1
MOVEI IO," "
CALLR D$VER
RETURN
JRST DGET2
DGET1: DCSOUT <[ASCIZ/BEGIN
DECLARE EXTANT INT
EXTANT=0
FOR "<FILES">
WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
AND (VERSION EQ /]>
MOVE IO,VBUF
DCNOUT <IO>
DCSOUT <[ASCIZ/)
AND (STATUS EQ ' ')
EXTANT=EXTANT+1
IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
END/],SEMI>
SETOM FLAGDE
CALLR RENDEM
RETURN
CALLR RENDER
RETURN
DGET2: DCSOUT <[ASCIZ/"<GET">="<FILES">/]>
HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
CALLR D$WITH
DCSOUT <SEMI>
CALLR NETOI
THUD
MOVE IO,[ASCII/;I249/]
CALLR RENFIP
RETURN
CALLR RENLIN
TSOUT <[ASCIZ/ [Ok]/],CRLF>
SETZM NSUM
DGET3: CALLR GETFIL
JRST DGET4 ; EXIT RETRIEVAL LOOP ON NETWORK EOF
CALLR LOCNFO
CALLR LOCOO
THUD
CALLR GETDAT
CALLR LOCC
SKIPE FLAGTT
CALLR NETRAT
AOJA FLAG,DGET3
DGET4: CALLR NETC
MOVE IO,[ASCII/;I269/]
CALLR RENFIP
JRST DGETE
CALLR RENLIN
CALLR NETSUM
SETOM FLAGDE
CALLR RENDER
RETURN
JUMPN FLAG,RETN(1)
TSOUT <[ASCIZ/ (No Such File)/],CRLF>
RETURN SKIP,1
DGETE: CALLR D$CON
ENDR
; FIELD LENGTHS IN WORDS FROM <GET>
GET$F==SBSIZE ; FILENAME
GET$E==SBSIZE ; EXTENSION
GET$D==4 ; DATE
; DLIN -- DATACOMPUTER LINK
;
DLIN: BEGINR <IO,UTIL,FLAG>
MOVE FLAG,FLAGDD
DLINI: TSOUT (<[BYTE (7)76,0,0,0,0]>)
TSIN (ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
JRST DLINI
JUMPE UTIL,DLINE
TSOUT <CRLF>
SETZM FLAGDD
DCSOUT <ABUF,CRLF>
SETOM FLAGDD
CALLR RENDER
JRST DLINI
JRST DLINI
DLINE: TSOUT <[ASCIZ/[Returning]/],CRLF>
MOVEM FLAG,FLAGDD
ENDR
; DLIS -- NODE DIRECTORY
; IN: FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS: BEGINR <IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
SETZM FLAGCO
>
; (((↑↑↑)))
CAIN FLAG,DL$T
JRST DLISO1
CAIN FLAG,DL$V
JRST DLISO2
CAIN FLAG,DL$P
JRST DLISO3
RETURN
DLISO1: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
JRST DLISI
DLISO2: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
JRST DLISI
DLISO3: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI: SETZ UTIL,
SETZM GBUF1
MOVE X1,[GBUF1,,GBUF1+1]
BLT X1,<GBUF1+LBSIZE-1>
MOVEI X1,<GBUF2+1>
MOVEM X1,GBUF2
CALLR RENPRE
CAMN IO,[ASCII/.I280/]
JRST DLISD
CALLR RENLIP
JRST DLISER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DLISN: DCBIN <IO>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DLISN: SKIPN FLAGCO
JRST DLISN0
HRROI X1,[ASCIZ/ [Aborting]
/]
PSOUT
MOVE X1,DCOJFN
MOVEI X2,22
MTOPR
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <SEMI>
JRST DLISER
DLISN0: DCBIN <IO>
>
; (((↑↑↑)))
CAIE IO," "
JRST DLISE
SETO UTIL,
SKIPE FLAGDD
JRST DLISD
CALLR <(FLAG)>
JRST DLISN
DLISD: CALLR RENLIN
JRST DLISN
DLISE: CAIN IO,"?"
JRST DEATH
CALLR RENLIN
JUMPN UTIL,DLISER
TSOUT <[ASCIZ/ [No Nodes]/],CRLF>
DLISER: SETZM FLAGDE
CALLR RENDER
RETURN
ENDR
; DL$T -- TERSE NODES
;
DL$T: BEGINR
CALLR DL$NAM
JRST DL$T0
TSOUT <CRLF>
DL$T0: CALLR RENLIN
ENDR
; DL$V -- VERBOSE NODES
;
DL$V: BEGINR <IO,UTIL,FLAG>
DL$VN: DCBIN <IO>
CAIE IO,"="
JRST DL$VN
CALLR DL$NAM
JRST DL$VE
TSOUT <CRLF>
MOVEI UTIL,GBUF1
SKIPE (UTIL)
AOJA UTIL,.-1
SUBI UTIL,GBUF1
DL$VF: DCBIN <IO>
CAIE IO,"="
JRST DL$VF
DCBIN <IO>
SETZ FLAG,
CAIN IO,"F"
MOVEI FLAG,5
CAIN IO,"P"
MOVEI FLAG,1
CAIN IO,"N"
MOVEI FLAG,3
JUMPE FLAG,DL$VE
CALLR RENLIN
DL$VD: MOVEI IO,(UTIL)
DL$VD0: TSOUT <[ASCIZ/ /]>
SOJGE IO,DL$VD0
MOVEI IO,"]"
TBOUT <IO>
DL$VD1: DCBIN <IO>
TBOUT <IO>
CAIE IO,12
JRST DL$VD1
SOJG FLAG,DL$VD
RETURN
DL$VE: CALLR RENLIN
ENDR
; DL$P -- PROTECTION
;
DL$P: BEGINR <IO>
CALLR DL$NAM
JRST DL$P1
TSOUT <CRLF>
CALLR RENLIN
RETURN
DL$P1: MOVEI IO,GBUF1
DL$P2: SKIPE (IO)
AOJA IO,DL$P2
SUBI IO,GBUF1
DL$P3: TSOUT <[ASCIZ/ /]>
SOJGE IO,DL$P3
MOVEI IO,"]"
TBOUT <IO>
DL$P4: DCBIN <IO>
TBOUT <IO>
CAIE IO,12
JRST DL$P4
ENDR
; DL$NAM -- DIRECTORY: NAME OUTPUT
; OUT: IO -- LAST CHARACTER INPUT
;
DL$NAM: BEGINR <BP,UTIL,FLAG,R10>
SETZ R10,
SETZ FLAG,
MOVE BP,[POINT 7,ABUF]
MOVEI UTIL,<SBSIZE*5>
DCBIN <IO>
CAILE IO," "
JRST DL$NA1
RETURN
DL$NAN: DCBIN <IO>
DL$NA1: CAIN IO,"."
JRST DL$NIN
CAIG IO," "
JRST DL$NA3
CAIE IO,42
JRST DL$NA2
DCBIN <IO>
DL$NA2: IDPB IO,BP
SOJG UTIL,DL$NAN
JRST DL$NER
DL$NA3: SETZ X1,
IDPB X1,BP
TSOUT <[ASCIZ/ /],ABUF>
RETURN SKIP,1
DL$NIN: MOVE BP,[POINT 7,ABUF]
MOVEI UTIL,<SBSIZE*5>
DL$NI1: DCBIN <IO>
CAIN IO,"."
JRST DL$NCN
CAIG IO," "
JRST DL$NCN
DL$NI2: CAIE IO,42
JRST DL$NI3
DCBIN <IO>
DL$NI3: IDPB IO,BP
SOJG UTIL,DL$NI1
JRST DL$NER
DL$NCN: SETZ X1,
IDPB X1,BP
SKIPN X2,GBUF1(FLAG)
JRST DL$NON
HRLI X2,(POINT 7,)
MOVE X1,[POINT 7,ABUF]
DL$NC1: ILDB X3,X1
ILDB X4,X2
CAIE X3,(X4)
JRST DL$NON
JUMPN X3,DL$NC1
CAIG IO," "
RETURN SKIP,1
AOJA FLAG,DL$NIN
DL$NON: CAIL FLAG,LBSIZE-2
JRST DL$NER
SETZM GBUF1+1(FLAG)
HRL X1,GBUF1+1(FLAG)
HRR X1,GBUF1+2(FLAG)
BLT X1,<GBUF1+LBSIZE-1>
MOVE X1,[POINT 7,ABUF]
SKIPN X2,GBUF1(FLAG)
HRR X2,GBUF2
HRLI X2,(POINT 7,)
HRRZI BP,(BP)
SUBI BP,<ABUF-1>
ADDI BP,(X2)
CAIL BP,<GBUF2+LBSIZE>
JRST DL$NER
HRRZM X2,GBUF1(FLAG)
DL$NO1: ILDB X3,X1
IDPB X3,X2
JUMPN X3,DL$NO1
HRRZI X2,1(X2)
MOVEM X2,GBUF2
MOVEI UTIL,(FLAG)
JUMPE R10,DL$NO2
TSOUT <CRLF>
DL$NO2: TSOUT <[ASCIZ/ /]>
SOJGE UTIL,DL$NO2
TSOUT <ABUF>
SETO R10,
CAIG IO," "
RETURN SKIP,1
AOJA FLAG,DL$NIN
DL$NER: TSOUT <[ASCIZ/ (Pathname too long.)/],CRLF>
ENDR
; DPUT -- PUT-STORE
;
DPUT: BEGINR <IO>
; (((TENEX)))
IFG F.TENX,<
GJINF
CAME X2,LDIR
CALLR D$CON
>
; (((↑↑↑)))
CALLR LOCFFI
RETURN
SKIPN OPENED
JRST DPUT3
MOVE X1,[440700,,OPENED]
MOVE X2,[440700,,NBUF]
DPUT1: ILDB X3,X1
ILDB X4,X2
CAIE X3,(X4)
JRST DPUT2
JUMPN X3,DPUT1
MOVEI X1,1
CAMN X1,OPENEM
JRST DPUT5
DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVEI X1,1
MOVEM X1,OPENEM
JRST DPUT5
DPUT2: SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
DPUT3: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST DPUT4
DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVE X1,[440700,,NBUF]
MOVE X2,[440700,,OPENED]
SCOPY (X1,X2)
MOVEI X1,1
MOVEM X1,OPENEM
JRST DPUT5
DPUT4: DCSOUT <[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
TSOUT <[ASCIZ/ [New <FILES>]/],CRLF>
MOVE X1,[440700,,NBUF]
MOVE X2,[440700,,OPENED]
SCOPY (X1,X2)
SETZM OPENEM
DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVEI X1,1
MOVEM X1,OPENEM
SETZM VBUF
JRST DPUT6
DPUT5: SETZM VBUF
SETZ IO,
CALLR D$VER
RETURN
DPUT6: AOS VBUF
DCSOUT <[ASCIZ/"<FILES">="<PUT">/],SEMI>
CALLR NETOO
THUD
MOVE IO,[ASCII/;I239/]
CALLR RENFIP
RETURN
CALLR RENLIN
TSOUT <[ASCIZ/ [Ok]/],CRLF>
SETZM NSUM
CALLR LOCOI
THUD
CALLR NETFFI
DPUT7: CALLR PUTFIL
CALLR PUTDAT
SKIPE FLAGTT
CALLR NETRAT
CALLR LOCNFI
JRST DPUT7
CALLR NETC
MOVE IO,[ASCII/;I259/]
CALLR RENFIP
JRST DPUTE
CALLR RENLIN
CALLR NETSUM
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN SKIP,1
DPUTE: CALLR D$CON
ENDR
; DREM -- DELETE NODES
;
DREM: BEGINR
DCSOUT <[ASCIZ/DELETE /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
DCSOUT <[ASCIZ/LIST /],CONTEX,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
RETURN
TSOUT <[ASCIZ/ [Connected To Attached Node]/],CRLF>
MOVE X1,[ASCII/%LOGI/]
MOVEM X1,CONTEX
MOVE X1,[ASCII/N/]
MOVEM X1,<CONTEX+1>
ENDR
; DUND -- UNDELETE
;
DUND: BEGINR <IO>
SETZ IO,
CALLR D$OPEN
RETURN
MOVEI IO,"D"
CALLR D$VER
RETURN
DCSOUT <[ASCIZ/BEGIN
DECLARE UNDELETED INTEGER
UNDELETED=0
UPDATE FILES IN "<FILES">/]>
HRRZI IO,[ASCIZ/ STATUS EQ 'D'/]
CALLR D$WITH
DCSOUT <DUNDS>
SETOM FLAGDE
CALLR RENDEM
RETURN
CALLR RENDER
RETURN
ENDR
DUNDS: ASCIZ/
BEGIN
STATUS=' '
UNDELETED=UNDELETED+1
COMMENT FILES.FILE.HEADER.FILENAME
! '.' ! FILES.FILE.HEADER.EXTENSION
! ';' ! FILES.FILE.HEADER.VERSION
END
IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
END;
/
; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT: BEGINR <IO,BP,UTIL,FLAG>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$IN0
TSOUT <[ASCIZ/ ?? Datacomputer initialization failure ??/],CRLF>
JRST QUIT
D$IN0: TSOUT <[ASCIZ/ [Attaching]/],CRLF>
HRRZI UTIL,HOSTS
D$IN1: SKIPN (UTIL)
JRST D$IND
HLRZ X1,(UTIL)
CAME X1,LHOST
AOJA UTIL,D$IN1
MOVE IO,[POINT 7,[ASCIZ/%TOP.DFTP./]]
MOVE BP,[POINT 7,ABUF]
SCOPY (IO,BP)
HRR IO,(UTIL)
HRLI IO,(POINT 7,)
SCOPY (IO,BP)
MOVEI IO,"."
IDPB IO,BP
; (((ITS)))
IFL F.TENX,<
.SUSET [.RXUNAME,,UBUF1]
SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
MOVE X1,[-1,,31]
MOVE X2,[-1,,32]
GETTAB X1,
THUD
GETTAB X2,
THUD
MOVEM X1,UBUF1
MOVEM X2,<UBUF1+1>
SETZM <UBUF1+2>
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
GETPPN X1,
JFCL
TRNN X1,770000
JRST [ LSH X1,↑D6
JRST .-1] ; Left Justify SAIL PN's
HRLZM X1,UBUF1
SETZM UBUF1+1
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((ITS+TOPS-10)
IFLE F.TENX,<
MOVE X1,[POINT 6,UBUF1]
MOVEI X2,42
ILDB X3,X1
JUMPE X3,.+7
ADDI X3,40
CAIL X3,"A"
CAILE X3,"Z"
IDPB X2,BP
IDPB X3,BP
JRST .-7
MOVE X1,BP
IDPB X3,X1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
GJINF
CAMN X1,X2
JRST .+10
HRROI X1,[ASCIZ/ (from /]
PSOUT
MOVEI X1,101
DIRST
THUD
HRROI X1,[ASCIZ/)
/]
PSOUT
HRROI X1,UBUF1
DIRST
THUD
MOVE X1,[POINT 7,UBUF1]
MOVEI X2,42
ILDB X3,X1
JUMPE X3,.+6
CAIL X3,"A"
CAILE X3,"Z"
IDPB X2,BP
IDPB X3,BP
JRST .-6
MOVE X1,BP
IDPB X3,X1
>
; (((↑↑↑)))
DCSOUT <[ASCIZ/LOGIN /],ABUF,SEMI>
CALLR RENPRE
CALLR RENLIN
SETZM FLAGDE
CALLR RENDER
JRST .+1
CAMN IO,[ASCII/;O032/]
JRST D$INP
CAME IO,[ASCII/*****/]
JRST D$IND
MOVEI FLAG,3
D$IN2: TSOUT <[ASCIZ/ [Password:/]>
TSIN (UBUF1,LBSIZE,<[ASCIZ/ [Password:/]>,NOECHO)
JRST D$IN2
TSOUT <[ASCIZ/]/],CRLF>
MOVE X2,BP
MOVEI X1,"("
IDPB X1,X2
MOVEI X1,"'"
IDPB X1,X2
MOVE X1,[440700,,UBUF1]
SCOPY (X1,X2)
MOVEI X1,"'"
IDPB X1,X2
MOVEI X1,")"
IDPB X1,X2
SETZ X1,
IDPB X1,X2
DCSOUT <[ASCIZ/LOGIN /],ABUF,SEMI>
CALLR RENDER
JRST .+2
JRST D$INP
TSOUT <[ASCIZ/ (Incorrect password.)/],CRLF>
SOJG FLAG,D$IN2
TSOUT <[ASCIZ/ [Attaching]/],CRLF>
D$IND: MOVE X1,[POINT 7,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
MOVE X2,[POINT 7,ABUF]
SCOPY (X1,X2)
DCSOUT <[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
TSOUT <[ASCIZ/ (as DFTP.GUEST)/],CRLF>
D$INP: DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<TERSE"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
MOVE UTIL,[ASCII/%LOGI/]
MOVEM UTIL,CONTEX
MOVE UTIL,[ASCII/N/]
MOVEM UTIL,<CONTEX+1>
SETZM OPENED
CALLR D$CON
ENDR
; D$CON -- CONNECT
;
D$CON: BEGINR <UTIL>
CALLR NETDSI
DCSOUT <[ASCIZ/CONNECT "<GET"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
CALLR NETDSO
DCSOUT <[ASCIZ/CONNECT "<PUT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
; (((TENEX)))
IFG F.TENX,<
GJINF
MOVEM X2,LDIR
>
; (((↑↑↑)))
ENDR
; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
; IN: IO -- MODE FLAG
; READ IF < 0
; WRITE IF = 0
; APPEND IF > 0
;
D$OPEN: BEGINR
SKIPN OPENED
JRST D$OP05
MOVE X1,[POINT 7,OPENED]
MOVE X2,[POINT 7,NBUF]
D$OP01: ILDB X3,X1
ILDB X4,X2
CAIE X3,(X4)
JRST D$OP05
JUMPN X3,D$OP01
CAMN IO,OPENEM
RETURN SKIP,1
JUMPE IO,D$OP02
JUMPG IO,D$OP03
DCSOUT <[ASCIZ/MODE "<FILES"> READ/],SEMI>
JRST D$OP04
D$OP02: DCSOUT <[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
JRST D$OP04
D$OP03: DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04: SETOM FLAGDE
CALLR RENDER
RETURN
MOVEM IO,OPENEM
RETURN SKIP,1
D$OP05: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$OP06
TSOUT <[ASCIZ/ (There are no <FILES>.)/],CRLF>
RETURN
D$OP06: SKIPN OPENED
JRST D$OP07
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
D$OP07: JUMPE IO,D$OP08
JUMPG IO,D$OP09
DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
JRST D$OP10
D$OP08: DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
JRST D$OP10
D$OP09: DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10: SETOM FLAGDE
CALLR RENDER
RETURN
MOVE X1,[POINT 7,NBUF]
MOVE X2,[POINT 7,OPENED]
SCOPY (X1,X2)
MOVEM IO,OPENEM
ENDR SKIP,1
; D$VER -- PRODUCE PROPER VERSION NUMBER
; IN: IO -- DEFAULT FLAG
; SMALLEST UNDELETED VERSION IF < 0
; LARGEST VERSION IF = 0
; LARGEST DELETED VERSION IF = "D"
; LARGEST UNDELETED VERSION IF = " "
; OUT: IO -- VERSION (IF DEFAULT)
;
D$VER: BEGINR <UTIL>
SKIPE VBUF
RETURN SKIP,1
JUMPE IO,D$VER1
LDB UTIL,[350700,,FBUF]
CAIN UTIL,"*"
SETOM VBUF
LDB UTIL,[350700,,EBUF]
CAIN UTIL,"*"
SETOM VBUF
SKIPE VBUF
RETURN SKIP,1
JUMPG IO,D$VER2
DCSOUT <[ASCIZ/BEGIN
DECLARE LEAST INT
LEAST=-1
FOR "<FILES">
WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
AND (STATUS EQ ' ')/],[ASCIZ/
BEGIN
IF LEAST EQ -1 THEN LEAST=VERSION ELSE
IF LEAST GT VERSION THEN LEAST=VERSION
END
IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
COMMENT '}' ! LEAST
END/],SEMI>
JRST D$VERE
D$VER1: DCSOUT <[ASCIZ/BEGIN
DECLARE GREATEST INT
GREATEST=0
FOR "<FILES">/]>
CALLR D$WITH
DCSOUT <[ASCIZ/
BEGIN
IF GREATEST LT VERSION THEN GREATEST=VERSION
END
COMMENT '}' ! GREATEST
END/],SEMI>
JRST D$VERE
D$VER2: DCSOUT <[ASCIZ/BEGIN
DECLARE GREATEST INT
GREATEST=-1
FOR "<FILES">
WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
AND (STATUS EQ '/]>
DCBOUT <IO>
SKIPN FLAGDD
JRST D$VER$
TBOUT <IO>
D$VER$: DCSOUT <[ASCIZ/')
BEGIN
IF GREATEST LT VERSION THEN GREATEST=VERSION
END
IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
COMMENT '}' ! GREATEST
END/],SEMI>
D$VERE: SETOM FLAGDE
CALLR RENDEM
RETURN
MOVE IO,[ASCII/;A282/]
CALLR RENFIP
RETURN
D$VERN: DCBIN <IO>
CAIE IO,"}"
JRST D$VERN
CALLR DCNIN
MOVEM IO,VBUF
CALLR RENLIN
CALLR RENDER
RETURN
ENDR SKIP,1
; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
; IN: IO -- POINTER TO FIXED QUALIFIER (OR 0)
; FLAGS:
D$W$F==400000
D$W$E==200000
D$W$V==100000
D$W$Q==010000
;
D$WITH: BEGINR <UTIL,FLAG>
SETZ FLAG,
LDB UTIL,[350700,,FBUF]
CAIE UTIL,"*"
TRO FLAG,D$W$F
LDB UTIL,[350700,,EBUF]
CAIE UTIL,"*"
TRO FLAG,D$W$E
SKIPLE VBUF
TRO FLAG,D$W$V
SKIPE IO
TRO FLAG,D$W$Q
JUMPE FLAG,RETN(0)
DCSOUT <[ASCIZ/ WITH/]>
TRNN FLAG,D$W$F
JRST D$WIT1
DCSOUT <[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
TRNN FLAG,D$W$E!D$W$V!D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT1: TRNN FLAG,D$W$E
JRST D$WIT2
DCSOUT <[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
TRNN FLAG,D$W$V!D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT2: TRNN FLAG,D$W$V
JRST D$WIT3
DCSOUT <[ASCIZ/ VERSION EQ /]>
MOVE UTIL,VBUF
DCNOUT <UTIL>
TRNN FLAG,D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT3: TRNN FLAG,D$W$Q
RETURN
DCSOUT <(IO)>
ENDR
; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM: BEGINR <IO,FLAG>
CALLR RENPRE
CAME IO,[ASCII/;I275/]
JRST NETS2
SETZ FLAG,
NETS1: DCBIN <IO>
CAIE IO,"="
JRST NETS1
SKIPN FLAG
SOJA FLAG,NETS1
CALLR DCNIN
CAME IO,NSUM
JRST NETS3
CALLR RENLIN
RETURN
NETS2: CALLR RENLIP
RETURN
NETS3: CALLR RENLIN
TSOUT <[ASCIZ/ (Network Checksum Error.)/],CRLF>
ENDR
; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT: BEGINR <IO,<IO+1>>
TSOUT <[ASCIZ/ (/]>
MOVEI IO,↑D36
IMULB IO,NSIZE
IDIV IO,NTIME
TNOUT <IO>
TSOUT <[ASCIZ/ Baud (/]>
MOVE IO,NSIZE
TNOUT <IO>
TSOUT <[ASCIZ/ bits in /]>
MOVE IO,NTIME
CAIN IO,0
MOVEI IO,1
TNOUT <IO>
HRRZI <IO+1>,[ASCIZ/ seconds))/]
CAIN IO,1
HRRZI <IO+1>,[ASCIZ/ second))/]
TSOUT <(IO+1),CRLF>
ENDR
; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER: BEGINR <IO,UTIL,FLAG>
SETZ FLAG,
RENDSL: CALLR RENPRE
CAMN IO,[ASCII/.I220/]
JRST RENDES
CAMN IO,[ASCII/.I210/]
JRST RENDRR
CAMN IO,[ASCII/;A282/]
JRST RENDPM
CAMN IO,[ASCII/.J151/]
JRST RENDPM
LDB UTIL,[350700,,IO]
CAIN UTIL,"+"
JRST RENDMM
CAIN UTIL,"-"
JRST RENDMM
JRST RENDFL
RENDMM: SETO FLAG,
SKIPN FLAGDE
JRST RENDFL
SETZM FLAGDE
RENDPM: CALLR RENLIP
JRST RENDSL
RENDFL: CALLR RENLIN
JRST RENDSL
RENDES: CALLR RENLIN
MOVEI IO,"L"-100
DCBOUT <IO>
SETO FLAG,
JRST RENDSL
RENDRR: CALLR RENLIN
JUMPN FLAG,RETN(0)
ENDR SKIP,1
; RENDEM -- REQUEST ENDER FOR MULTIPLE LINE REQUESTS
;
RENDEM: BEGINR <IO,UTIL,FLAG>
SETZ FLAG,
RENMSL: CALLR RENPRE
CAMN IO,[ASCII/.I210/]
JRST RENMFL
CAMN IO,[ASCII/.I220/]
JRST RENMES
LDB UTIL,[350700,,IO]
CAIN UTIL,"+"
JRST RENMMM
CAIN UTIL,"-"
JRST RENMMM
JRST RENMEM
RENMMM: SKIPN FLAG
MOVEI FLAG,-1
SKIPN FLAGDE
JRST RENMEM
SETZM FLAGDE
CALLR RENLIP
JRST RENMER
RENMEM: CALLR RENLIN
RENMER: JUMPN FLAG,RENMSL
RETURN SKIP,1
RENMFL: CALLR RENLIN
JUMPE FLAG,RENMSL
RETURN
RENMES: CALLR RENLIN
JUMPL FLAG,RENMSL
MOVEI IO,"L"-100
DCBOUT <IO>
SETO FLAG,
JRST RENMSL
ENDR
; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
; IN: IO -- PREFIX
;
RENFIP: BEGINR <BP,UTIL,FLAG>
MOVE FLAG,IO
SETZ UTIL,
RENFIL: CALLR RENPRE
CAMN IO,FLAG
RETURN SKIP,1
LDB BP,[350700,,IO]
CAIN BP,";"
JRST RENFIN
CAIN BP,"."
JRST RENFIN
SKIPN UTIL
CALLR RENLIP
SKIPE UTIL
CALLR RENLIN
AOJA UTIL,RENFIL
RENFIN: CALLR RENLIN
CAMN IO,[ASCII/.I220/]
JRST RENFIS
CAMN IO,[ASCII/.I210/]
RETURN
JRST RENFIL
RENFIS: MOVEI IO,"L"-100
DCBOUT <IO>
SETZM FLAGDE
CALLR RENDER
RETURN
ENDR
; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN: BEGINR <IO>
RENLNL: DCBIN <IO>
CAIE IO,12
JRST RENLNL
ENDR
; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP: BEGINR <IO>
SKIPN FLAGDD
JRST RENLPF
RENLPL: DCBIN <IO>
CAIE IO,12
JRST RENLPL
RETURN
RENLPF: DCBIN <IO>
CAIN IO,12
RETURN
CAIE IO,11
JRST RENLPF
MOVEI IO," "
TBOUT <IO>
MOVEI IO,"("
RENLPP: TBOUT <IO>
RENLPQ: DCBIN <IO>
CAIN IO,42
JRST RENLPQ
CAIE IO,15
JRST RENLPP
DCBIN <IO>
MOVEI IO,")"
TBOUT <IO>
TSOUT <CRLF>
ENDR
; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
; OUT: IO -- ASCII PREFIX (5 BYTES)
;
RENPRE: BEGINR <BP,UTIL,FLAG>
RENPRP: SETZ IO,
MOVE BP,[POINT 7,IO]
MOVEI FLAG,5
RENPRL: DCBIN <UTIL>
CAIN UTIL,15
JRST RENPRL
CAIN UTIL,12
JRST RENPRL
IDPB UTIL,BP
SOJG FLAG,RENPRL
LDB UTIL,[350700,,IO]
CAIN UTIL,"?"
JRST DEATH
CAIE UTIL,"!"
RETURN
CALLR RENLIP
JRST RENPRP
ENDR
; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH: CALLR RENLIP
TSOUT <[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
.VALUE
.BREAK 16,160000
>
; (((TOPS-10)))
IFE F.TENX,<
EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
HALTF
JRST .-1
>
; (((↑↑↑)))
; ***I/O ROUTINES***
; TAIN -- TERMINAL AUTHORIZATION INPUT
; IN: X1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$: BEGINR <IO>
MOVEI IO,(X1)
TSOUT <(IO)>
TAIN1: TBIN <IO>
CAIN IO,15
JRST TAIN1
CAIN IO,"R"-100
JRST TAIN1
CAIN IO,"N"
JRST TAIN2
CAIN IO,"Y"
JRST TAIN3
CAIN IO,12
JRST TAIN4
CAIN IO,33
JRST TAIN4
CAIN IO,37
JRST TAIN4
CAIN IO," "
JRST TAIN4
TSOUT <[ASCIZ/XXX/],CRLF>
RETURN
TAIN2: TSOUT <[ASCIZ/No/],CRLF>
RETURN SKIP,1
TAIN3: TSOUT <[ASCIZ/Yes/]>
TAIN4: TSOUT <CRLF>
ENDR SKIP,2
; TERMINAL COMMAND INPUT ROUTINE
;
; WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
; INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
; IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
; LINE FEED, EOL, OR SPACE WILL FINISH IT.
; IF NOT, SUCH CHARACTERS WILL BE REJECTED.
; ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
; ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
; IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
; POINTER TO COMMAND STRING LIST
; NUMBER OF COMMANDS
; NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
; NUMBER OF WORDS IN LARGEST COMMAND STRING
; <VALUE LIST>
; <COMMAND STRING LIST>
; OUT: TCIO -- LAST CHAR INPUT
; FLAG -- COMMAND VALUE
; RETURNS: SKIP,0 -- DELETE LINE
; SKIP,1 -- NULL COMMAND
; SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$: BEGINR <TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
MOVE TCIACB,TCIO
SETZ UTIL,
TCII01: MOVEM UTIL,TCIPCL(UTIL)
ADDI UTIL,1
CAME UTIL,1(TCIACB)
JRST TCII01
ADDI UTIL,TCIPCL
MOVEM UTIL,TCIPNF
HRRI UTIL,TCIPCL
HRL UTIL,1(TCIACB)
MOVEM UTIL,TCIPLP
MOVE TCIBP,[POINT 7,ABUF]
HRLI TCISBP,350700
HRR TCISBP,(TCIACB)
SETZ TCISCC,
TCICHR: TBIN <TCIO>
CAIN TCIO,"R"-100
JRST TCIREP
CAIN TCIO,"?"
JRST TCIQUA
CAIN TCIO,"A"-100
JRST TCIDEL
CAIN TCIO,"X"-100
JRST TCIENR
CAIN TCIO,177
JRST TCIENR
CAIN TCIO,15
JRST TCICHR
CAIN TCIO,12
JRST TCIC01
CAIN TCIO,37
JRST TCIC01
CAIN TCIO," "
JRST TCIC01
CAIN TCIO,33
JRST TCIC01
CAIG TCIO," "
JRST TCIBAD
JRST TCIC02
TCIC01: JUMPE TCISCC,TCIENN
HLRZ UTIL,TCIPLP(TCISCC)
CAIN UTIL,1 ; OK IF JUST ONE POSSIBILITY
JRST TCIEND
TCIC02: SETZ TCIPCC,
MOVE TCIPBP,TCISBP
MOVE UTIL,TCIPNF
MOVEM UTIL,<TCIPLP+1>(TCISCC)
SETZ TCIMAC,
HRRZI TCIMAN,-1
TCIC03: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC04
CAIE UTIL,(TCIO)
JRST TCIC08
TCIC04: HLRZ TCITCC,TCIPLP(TCISCC)
HRRZ TCITLP,TCIPLP(TCISCC)
TCIC05: MOVE UTIL,(TCITLP)
CAIN UTIL,(TCIPCC)
JRST TCIC06
AOJ TCITLP,
SOJG TCITCC,TCIC05
JRST TCIC08
TCIC06: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC07
AOJ TCIMAC,
MOVEM TCIPCC,@TCIPNF
AOS TCIPNF
JRST TCIC08
TCIC07: CAIN TCIMAN,-1
SETO TCIMAN,
CAIE TCIMAN,-1
HRRZI TCIMAN,(TCIPCC)
TCIC08: ADD TCIPBP,3(TCIACB)
AOJ TCIPCC,
CAME TCIPCC,1(TCIACB)
JRST TCIC03
CAIN TCIO,12
JRST TCIC09
CAIN TCIO,37
JRST TCIC09
CAIN TCIO," "
JRST TCIC09
CAIE TCIO,33
JRST TCIC10
TCIC09: JUMPL TCIMAN,TCIBAD
CAIN TCIMAN,-1
JRST TCIBAD
JRST TCIEND
TCIC10: JUMPE TCIMAC,TCIBAD
AOJ TCISCC,
HRLM TCIMAC,TCIPLP(TCISCC)
IBP TCISBP
IDPB TCIO,TCIBP
TBOUT <TCIO> ; ECHO
JRST TCICHR
TCIBAD: MOVEI TCIO,"G"-100
TBOUT <TCIO>
JRST TCICHR
TCIREP: TSOUT <CRLF>
HLRZ UTIL,TCIACB
TSOUT <(UTIL)>
HRRZI TCIPCC,(TCISCC) ; OUTPUT LOOP CONTROL = CHARS SO FAR
MOVE TCIPBP,[POINT 7,ABUF]
TCIR01: SOJL TCIPCC,TCICHR
ILDB TCIO,TCIPBP
TBOUT <TCIO>
JRST TCIR01
TCIQUA: TBOUT <TCIO> ; PRINT "?"
HLRZ TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
HRRZ TCIPBP,TCIPLP(TCISCC)
TCIQ01: TSOUT <CRLF>
MOVEI TCIO,11
TBOUT <TCIO>
MOVE TCITCC,2(TCIACB)
MOVE TCITLP,(TCIPBP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,(POINT 7,)
TCIQ02: ILDB TCIO,TCITLP
JUMPE TCIO,TCIQ03
TBOUT <TCIO>
SOJG TCITCC,TCIQ02
TCIQ03: AOJ TCIPBP,
SOJG TCIPCC,TCIQ01
JRST TCIREP
TCIDEL: JUMPLE TCISCC,TCIBAD ; THERE'S NO CHARACTER TO DELETE
MOVEI TCIO,"\"
TBOUT <TCIO>
LDB TCIO,TCIBP
TBOUT <TCIO>
SOJ TCIBP, ; FIX LINE BYTE PTR
IBP TCIBP
IBP TCIBP
IBP TCIBP
IBP TCIBP
HRRZ UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
MOVEM UTIL,TCIPNF
SOJ TCISBP, ; FIX SCAN BYTE PTR
IBP TCISBP
IBP TCISBP
IBP TCISBP
IBP TCISBP
SOJA TCISCC,TCICHR
TCIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETZ FLAG,
RETURN
TCIENN: SETZ FLAG,
RETURN SKIP,1
TCIEND: MOVE TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
MOVE TCITLP,(TCITLP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,(POINT 7,)
SETZ TCITCC,
TCIE01: IBP TCITLP
AOJ TCITCC,
CAIE TCITCC,(TCISCC)
JRST TCIE01
TCIE02: AOJ TCITCC,
CAMLE TCITCC,2(TCIACB)
JRST TCIE03
ILDB TCIMAC,TCITLP
JUMPE TCIMAC,TCIE03
TBOUT <TCIMAC>
JRST TCIE02
TCIE03: MOVE TCITLP,TCIPLP(TCISCC)
MOVE FLAG,(TCITLP)
ADDI FLAG,4(TCIACB)
MOVE FLAG,(FLAG)
ENDR SKIP,2
; TERMINAL STRING INPUT
; IN: IO -- POINTER TO BUFFER,,SIZE OF BUFFER
; UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
; OUT: IO -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
; UTIL -- COUNT OF CHARACTERS
;
$TSIN$: BEGINR <BP,R10,R11,R12>
MOVE R10,IO
MOVE R11,UTIL
HLR BP,IO
HRLI BP,(POINT 7,)
SETZ UTIL,
TSICHR: TBIN <IO>
CAIN IO,"R"-100
JRST TSIREP
CAIN IO,"A"-100
JRST TSIDEL
CAIN IO,"X"-100
JRST TSIENR
CAIN IO,177
JRST TSIENR
CAIN IO,15
JRST TSICHR
CAIN IO,12
JRST TSIEND
CAIN IO,33
JRST TSIEND
CAIN IO,37
JRST TSIEND
CAIGE IO," "
JRST TSIBAD
CAIL UTIL,(R10)
JRST TSIBAD
IDPB IO,BP
ADDI UTIL,1
JUMPL R11,TSICHR
TBOUT <IO>
JRST TSICHR
TSIBAD: MOVEI IO,"G"-100
TBOUT <IO>
JRST TSICHR
TSIREP: TSOUT <CRLF>
TSOUT <(R11)>
JUMPL R11,TSICHR
HRRZI IO,(BP)
HLR R12,R10
CAIGE IO,(R12)
JRST TSICHR
HRLI R12,(POINT 7,)
TSIR01: CAMN R12,BP
JRST TSICHR
ILDB IO,R12
TBOUT <IO>
JRST TSIR01
TSIDEL: JUMPE UTIL,TSIBAD
MOVEI IO,"\"
TBOUT <IO>
LDB IO,BP
SOJ BP,
IBP BP
IBP BP
IBP BP
IBP BP
SUBI UTIL,1
JUMPL R11,TSICHR
TBOUT <IO>
JRST TSICHR
TSIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETO IO,
SETZ UTIL,
RETURN
TSIEND: SETZ R12,
IDPB R12,BP
ENDR SKIP,1
; TERMINAL NUMBER INPUT
; IN: IO -- POINTER TO ↑R TEXT,,RADIX
; OUT: IO -- NUMBER
;
$TNIN$: BEGINR <BP,UTIL,FLAG>
MOVE UTIL,IO
MOVE BP,[POINT 7,UBUF1]
SETZ FLAG,
TNICHR: TBIN <IO>
CAIN IO,"R"-100
JRST TNIREP
CAIN IO,"A"-100
JRST TNIDEL
CAIN IO,"X"-100
JRST TNIENR
CAIN IO,177
JRST TNIENR
CAIN IO,15
JRST TNICHR
CAIN IO,12
JRST TNIEND
CAIN IO,33
JRST TNIEND
CAIN IO,37
JRST TNIEND
CAIN IO," "
JRST TNIEND
CAIGE IO,"0"
JRST TNIBAD
CAIL IO,"0"(UTIL)
JRST TNIBAD
CAILE FLAG,12 ; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
JRST TNIBAD
IDPB IO,BP
TBOUT <IO>
AOJA FLAG,TNICHR
TNIBAD: MOVEI IO,"G"-100
TBOUT <IO>
JRST TNICHR
TNIREP: TSOUT <CRLF>
HLRZ IO,UTIL
TSOUT <(IO)>
HRRZI IO,(BP)
CAIGE IO,UBUF1
JRST TNICHR
MOVE IO,[POINT 7,UBUF1]
TNIR01: CAMN IO,BP
JRST TNICHR
ILDB X1,IO
TBOUT <X1>
JRST TNIR01
TNIDEL: JUMPE FLAG,TNIBAD
MOVEI IO,"\"
TBOUT <IO>
LDB IO,BP
SOJ BP,
IBP BP
IBP BP
IBP BP
IBP BP
TBOUT <IO>
SOJA FLAG,TNICHR
TNIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETZ IO,
RETURN
TNIEND: SETZ IO,
IDPB IO,BP
MOVE BP,[POINT 7,UBUF1]
MOVEI FLAG,(UTIL)
TNICAL: ILDB UTIL,BP
JUMPE UTIL,RETN(1)
IMULI IO,(FLAG)
SUBI UTIL,"0"
ADDI IO,(UTIL)
JRST TNICAL
ENDR
; DCNIN -- DATACOMPUTER NUMBER INPUT
; OUT: IO -- 36-BIT MAGNITUDE INTEGER
;
DCNIN: BEGINR <<IO+1>,UTIL>
SETZ IO,
DCNIN1: DCBIN <UTIL>
CAIGE UTIL,"0"
RETURN
CAILE UTIL,"9"
RETURN
JUMPL IO,DCNIN2
MULI IO,↑D10
CAILE IO,1
JRST DCNIN2
CAIN IO,1
TLO <IO+1>,400000
MOVE IO,<IO+1>
ADDI IO,-"0"(UTIL)
JRST DCNIN1
DCNIN2: SETO IO,
JRST DCNIN1
ENDR
; $NOUT$ -- INTEGER OUTPUT
; IN: X1 -- INTEGER
; X2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$: BEGINR <FLAG>
MOVE FLAG,X2
MOVE X3,[POINT 7,UBUF1]
MOVEI X4,1
JUMPGE X1,NOUT1
LSHC X1,-↑D35
LSH X2,-1
DIVI X1,(FLAG)
JRST .+2
NOUT1: IDIVI X1,(FLAG)
ADDI X2,60
IDPB X2,X3
SKIPE X1
AOJA X4,NOUT1
MOVE X1,[POINT 7,UBUF2]
NOUT2: LDB X2,X3
IDPB X2,X1
SOJ X3,
IBP X3
IBP X3
IBP X3
IBP X3
SOJG X4,NOUT2
IDPB X4,X1
SKIPL FLAG
JRST NOUT3
DCSOUT <UBUF2>
RETURN
NOUT3: TSOUT <UBUF2>
ENDR
; ***SYSTEM DEPENDENT ROUTINES***
; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
.OPEN TTI,[.UAI,,'TTY'] ; TTY input
THUD
.CALL [ SETZ
SIXBIT/TTYGET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVEM ; first set of character groups
MOVEM ; second set of character groups
SETZM X1] ; TTYSTS variable
THUD
TLO X1,200 ; disable **MORE** processing
MOVE [030303,,030303] ; turn off echoing
.CALL [ SETZ
SIXBIT/TTYSET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVE ; first set of character groups
MOVE ; second set of character groups
SETZ X1] ; TTYSTS variable
THUD
.OPEN TTO,[.UAO,,'TTY'] ; TTY output
THUD
.CALL [ SETZ ; host number
SIXBIT/NETHST/
MOVEI -1
MOVEM
SETZM LHOST]
THUD
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .UII!40050 ; OPEN on gensymmed socket, 32 bits
MOVEI ICP
[('NET')] ; network device
[-1] ; initial local socket is gensymmed
MOVEI DCSOKT ; initial foreign socket(DATACOMPUTER)
SETZI DCHOST] ; foreign host(CCA)
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI ICP
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
MOVE X1,[ICP,,RCHBLK]
.RCHST X1, ; get status of network channel
HRRE X1,RCHBLK+4 ; get status of network
JUMPL X1,NETDED ; network dead if .LE. 0
CAIN X1,%NSCLI ; CLS w/ input?
JRST ICPWIN
CAIE X1,%NSINP ; input available?
CAIN X1,%NSOPN ; connection open?
JRST ICPWIN
JUMPN X1,[THUD] ; any other condition is lossage
ICPCLS: TSOUT <[ASCIZ/Cannot establish network connection/]>
.BREAK 16,160000
NETDED: TSOUT <[ASCIZ/ARPAnet is down/]>
.BREAK 16,160000
ICPWIN: MOVE X1,RCHBLK+1 ; get gensymmed local socket
ADDI X1,2 ; receive
MOVEM X1,LCLRCV
ADDI X1,1 ; transmit
MOVEM X1,LCLTRN
.IOT ICP,X1 ; get foreign place's socket
.CLOSE ICP, ; free up ICP socket right away
MOVEM X1,FORRCV ; receive
ADDI X1,1 ; socket to me!
MOVEM X1,FORTRN
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAI
MOVEI DCI ; DATACOMPUTER input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAO
MOVEI DCO ; DATACOMPUTER output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCI
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
JUMPE X1,ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCO
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
JUMPE X1,ICPCLS
MOVEI X1,2 ; offset for data sockets
ADDM X1,LCLRCV
ADDM X1,LCLTRN
ADDM X1,FORRCV
ADDM X1,FORTRN
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: .IOT DCO,["Z"-100] ; SEND QUIT
QUIT1: DCBIN <IO>
JUMPGE IO,QUIT1
.CLOSE DCI,
.CLOSE DCO,
.BREAK 16,160000
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI DDI ; DATACOMPUTER data input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDI
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
JUMPE X1,ICPCLS
RETURN SKIP,1
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI DDO ; DATACOMPUTER data output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDO
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
JUMPE X1,ICPCLS
RETURN SKIP,1
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
.CLOSE DDI,
.CLOSE DDO,
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;
NETDSI: BEGINR
MOVE UTIL,LCLRCV
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;
NETDSO: BEGINR
MOVE UTIL,LCLTRN
ENDR
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI LCI
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOI1
RETURN SKIP,1
LOCOI1: TSOUT <[ASCIZ/ (Local file not found.)/],CRLF>
ENDR
;LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI LCO
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOO1
.CALL [ SETZ
SIXBIT/SFDATE/
MOVEI LCO
SETZ LCLDAT]
THUD
RETURN SKIP,1
LOCOO1: TSOUT <[ASCIZ/ ?? Local file creation failure ??/],CRLF>
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
.CLOSE LCI,
.CLOSE LCO,
ENDR
; LOCS -- LOCAL FILE (SIZE)
;
LOCS: BEGINR
.CALL [ SETZ
SIXBIT/FILLEN/
MOVEI LCI
SETZM IO]
SETZ IO, ; it should not crap out
ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
; IN: IO -- ADDRESS OF TIME STRING
; OUT: UTIL -- ITS DISK FORMAT DATE/TIME
;
LUTTSN: BEGINR <BP>
SETZ UTIL,
ILDB X1,IO
CAIL X1,"0"
CAILE X1,"9"
RETURN
SUBI X1,"0"
IMULI X1,↑D10
ILDB X2,IO
CAIL X2,"0"
CAILE X2,"9"
RETURN
ADDI X1,-"0"(X2)
ILDB X2,IO
CAIE X2,"-"
RETURN
MOVE X2,[POINT 7,X3]
SETZ X3,
REPEAT 3,<
ILDB X4,IO
IDPB X4,X2
>
MOVEI X2,↑D12
CAMN X3,LUTTM-1(X2)
JRST .+3
SOJGE X2,.-2
RETURN
ILDB X3,IO
CAIE X3,"-"
RETURN
ILDB X3,IO
CAIL X3,"0"
CAILE X3,"9"
RETURN
SUBI X3,"0"
IMULI X3,↑D10
ILDB X4,IO
CAIL X4,"0"
CAILE X4,"9"
RETURN
ADDI X3,-"0"(X4)
DPB X3,[POINT 7,UTIL,8]
DPB X2,[POINT 4,UTIL,12]
DPB X1,[POINT 5,UTIL,17]
ILDB X1,IO
CAIE X1," "
RETURN
ILDB X1,IO
SUBI X1,"0"
IMULI X1,↑D10
ILDB X2,IO
ADDI X1,-"0"(X2)
IMULI X1,6
ILDB X2,IO
CAIE X2,":"
RETURN
ILDB X2,IO
ADDI X1,-"0"(X2)
IMULI X1,↑D10
ILDB X2,IO
ADDI X1,-"0"(X2)
IMULI X1,6
ILDB X2,IO
CAIE X2,":"
JRST [ IMULI X1,↑D20
JRST LUTSN1]
ILDB X2,IO
ADDI X1,-"0"(X2)
IMULI X1,↑D10
ILDB X2,IO
ADDI X1,-"0"(X2)
LSH X1,1
LUTSN1: ADDI UTIL,(X1)
ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
; IN: UTIL -- ITS DISK FORMAT DATE/TIME
; BP -- BYTE POINTER TO DESTINATION STRING
; OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS: BEGINR
LDB X3,[POINT 5,UTIL,17] ; DAY
IDIVI X3,↑D10
ADDI X3,"0"
ADDI X4,"0"
IDPB X3,BP
IDPB X4,BP
MOVEI X3,"-"
IDPB X3,BP
LDB X3,[POINT 4,UTIL,12] ; MONTH
HRRI X3,LUTTM-1(X3)
HRLI X3,(POINT 7,)
SCOPY (X3,BP)
MOVEI X3,"-"
IDPB X3,BP
LDB X3,[POINT 7,UTIL,8] ; YEAR
IDIVI X3,↑D10
ADDI X3,"0"
ADDI X4,"0"
IDPB X3,BP
IDPB X4,BP
MOVEI X3," "
IDPB X3,BP
LDB X2,[POINT 17,UTIL,34] ; TIME IN SECONDS
IDIVI X2,↑D3600
MOVEI X4,(X3)
IDIVI X2,↑D10
ADDI X2,"0"
ADDI X3,"0"
IDPB X2,BP
IDPB X3,BP
MOVEI X2,":"
IDPB X2,BP
MOVEI X2,(X4)
IDIVI X2,↑D60
MOVEI X4,(X3)
IDIVI X2,↑D10
ADDI X2,"0"
ADDI X3,"0"
IDPB X2,BP
IDPB X3,BP
MOVEI X2,":"
IDPB X2,BP
MOVEI X2,(X4)
IDIVI X2,↑D10
ADDI X2,"0"
ADDI X3,"0"
IDPB X2,BP
IDPB X3,BP
SETZ X2,
IDPB X2,BP
ENDR ; return
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM: ASCII/JAN/
ASCII/FEB/
ASCII/MAR/
ASCII/APR/
ASCII/MAY/
ASCII/JUN/
ASCII/JUL/
ASCII/AUG/
ASCII/SEP/
ASCII/OCT/
ASCII/NOV/
ASCII/DEC/
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IO>
SETZM LCLFN1 ; < prevent assembly error
MOVSI X1,'> '
MOVEM X1,LCLFN2
HRLI IO,(POINT 7,)
LUTFN1: CALLR LUTWRD ; get a SIXBIT word
MOVEM X1,LCLFN1
JUMPE X2,RETN(0)
CAIE X2,"."
JRST LUTFN1
CALLR LUTWRD
CAIE X1,
MOVEM X1,LCLFN2 ; use FN2 if specified
ENDR
; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN X1, DELIMITER IN X2
;
LUTWRD: BEGINR <BP>
SETZ X1, ; initialize word, word pointer
MOVE BP,[POINT 6,X1]
LUTWR1: ILDB X2,IO ; get a character from buffer
CAIN X2,"."
JRST RETN(0)
JUMPE X2,RETN(0)
SUBI X2," " ; SIXBITify from ASCII
TRNN X1,77 ; and save in word until word filled
IDPB X2,BP
JRST LUTWR1
ENDR
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI: BEGINR
SETZM FFITYP
SETO X1,
CAME X1,FSBUF
CAMN X1,ESBUF
CAIA
JRST NETFI1
.IOT TTO,[" "]
.IOT TTO,["("]
SETOM FFITYP
NETFI1: MOVE X1,[POINT 6,LCLFN1]
MOVEI X2,6
MOVE X3,[POINT 7,FBUF]
ILDB X4,X1
JUMPE X4,.+4
ADDI X4," "
SKIPE FFITYP
.IOT TTO,X4
SKIPE GBUF1
IDPB X4,X3
SOJG X2,.-7
NETFI2: SKIPE FFITYP
.IOT TTO,["."]
MOVE X1,[POINT 6,LCLFN2]
MOVEI X2,6
MOVE X3,[POINT 7,EBUF]
ILDB X4,X1
JUMPE X4,.+4
ADDI X4," "
SKIPE FFITYP
.IOT TTO,X4
SKIPE GBUF2
IDPB X4,X3
SOJG X2,.-7
NETFI3: SKIPN FFITYP
RETURN
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <IO,BP,UTIL>
SETZM IOBUFR
MOVE X1,[IOBUFR,,IOBUFR+1]
BLT X1,IOBUFR+1777
.RDTIM X1,
IDIVI X1,↑D30
MOVEM X1,NTIME
MOVE BP,[POINT 7,IOBUFR]
MOVE UTIL,[POINT 7,FBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
MOVE UTIL,[POINT 7,EBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
.CALL [ SETZ
SIXBIT/RFDATE/
MOVEI LCI
SETZM UTIL]
MOVSI UTIL,124201
CALLR LUTTNS
.CALL [ SETZ
SIXBIT/RQDATE/
SETZM UTIL]
MOVSI UTIL,124201
CALLR LUTTNS
HRLI BP,004400
MOVE UTIL,VBUF
IDPB UTIL,BP
CALLR LOCS
IDPB IO,BP
MOVNI UTIL,17
IDPB UTIL,BP
HRRZI BP,(BP)
MOVEI X1,(BP)
SUBI BP,IOBUFR-1
MOVEM BP,NSIZE
SETZ UTIL,
ADD UTIL,(X1)
SOJ X1,
SOJG BP,.-2
ADDM UTIL,NSUM
MOVN X1,NSIZE
HRLS X1
HRRI X1,IOBUFR
.IOT DDO,X1
ENDR
; PUTDAT -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
PUTDAT: BEGINR <UTIL,IO>
CALLR LOCS ; get length of file
AOS NSIZE
ADDM IO,NSUM
ADDM IO,NSIZE
MOVE X1,[-1,,IO]
.IOT DDO,X1
SETZ UTIL,
PUTD1: MOVE X1,[-2000,,IOBUFR]
.IOT LCI,X1 ; read 1K from local file
JUMPL X1,PUTD2 ; hit EOF here
MOVE X1,[-2000,,IOBUFR]
.IOT DDO,X1
MOVSI X1,-2000 ; compute checksum
ADD UTIL,IOBUFR(X1)
AOBJN X1,.-1
JRST PUTD1
PUTD2: MOVEI X1,-IOBUFR(X1) ; get # of words transferred
JUMPE X1,PUTD3
MOVNS X1
HRLZS X1
PUSH STAK,X1
HRRI X1,IOBUFR
.IOT DDO,X1
POP STAK,X1
ADD UTIL,IOBUFR(X1)
AOBJN X1,.-1
PUTD3: ADDM UTIL,NSUM
ADDM UTIL,NSUM
MOVE X1,[-1,,UTIL]
.IOT DDO,X1
.RDTIM X1,
IDIVI X1,↑D30
SUBM X1,NTIME
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <IO,UTIL>
.RDTIM X1,
IDIVI X1,↑D30
MOVEM X1,NTIME
MOVE IO,[-GET$F,,FBUF]
.IOT DDI,IO
JUMPL IO,RETN(0)
MOVEI IO,GET$F
MOVEM IO,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[-GET$E,,EBUF]
.IOT DDI,IO
MOVEI IO,GET$E
ADDM IO,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[-GET$D,,ABUF]
.IOT DDI,IO
MOVEI IO,GET$D
ADDM IO,NSIZE
SETZ UTIL,
ADD UTIL,<ABUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[POINT 7,ABUF]
CALLR LUTTSN
MOVEM UTIL,LCLDAT
HRROI IO,ABUF
.IOT DDI,IO
AOS NSIZE
MOVE X1,ABUF
ADDM X1,NSUM
HRROI IO,ABUF
.IOT DDI,IO
AOS NSIZE
MOVE X1,ABUF
ADDM X1,NSUM
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT: BEGINR <IO,UTIL,FLAG>
HRROI IO,FLAG
.IOT DDI,IO
JUMPE FLAG,GETD3
ADDM FLAG,NSUM
AOS NSIZE
ADDM FLAG,NSIZE
SETZ UTIL,
GETD1: CAIGE FLAG,2000
JRST GETD2
SUBI FLAG,2000
MOVE X1,[-2000,,IOBUFR]
.IOT DDI,X1 ; read 1K from DATACOMPUTER
MOVE X1,[-2000,,IOBUFR]
.IOT LCO,X1
MOVSI X1,-2000 ; compute checksum
ADD UTIL,IOBUFR(X1)
AOBJN X1,.-1
JRST GETD1
GETD2: JUMPE FLAG,GETD3
MOVN X1,FLAG
HRLZS X1
HRRI X1,IOBUFR
PUSH STAK,X1
.IOT DDI,X1
MOVE X1,(STAK)
.IOT LCO,X1
POP STAK,X1
ADD UTIL,(X1)
AOBJN X1,.-1
GETD3: ADDM UTIL,NSUM
HRROI IO,ABUF
.IOT DDI,IO
MOVE IO,ABUF
ADDM IO,NSUM
AOS NSIZE
HRROI IO,ABUF
.IOT DDI,IO
MOVE IO,ABUF
ADDM IO,NSUM
AOS NSIZE
CAMN IO,UTIL
JRST GETD4
TSOUT <[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD4: .RDTIM X1,
IDIVI X1,↑D30
SUBM X1,NTIME
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR <IO>
SETZM GBUF1
LDB X1,[350700,,FBUF]
CAIN X1,"*"
SETOM GBUF1
SETZM GBUF2
LDB X1,[350700,,EBUF]
CAIN X1,"*"
SETOM GBUF2
SETO X1,
CAMN X1,FSBUF
JRST LOCFI0
CAMN X1,ESBUF
JRST LOCFI0
JRST LOCFI5
LOCFI0: .CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ LCLSNM]
RETURN
MOVE X1,[-2000,,DIRBLK]
.IOT X1
.CLOSE
LOCFI1: MOVE IO,DIRBLK+1 ; POINTER TO NAME AREA
ADDI IO,DIRBLK
CAIN IO,DIRBLK+2000 ; END OF DIRECTORY?
RETURN
MOVEI X1,5
ADDM X1,DIRBLK+1
SETO X1,
CAME X1,FSBUF
JRST LOCFI2
CAME X1,ESBUF
JRST LOCFI3
JRST LOCFI4
LOCFI2: MOVE X1,[POINT 7,FSBUF]
MOVE X2,[POINT 6,X4]
MOVEI X3,6
SETZ X4,
ILDB X1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB X2
SOJG X3,.-6
CAMN X4,(IO)
JRST LOCFI4
JRST LOCFI1
LOCFI3: MOVE X1,[POINT 7,ESBUF]
MOVE X2,[POINT 6,X4]
SETZ X4,
MOVEI X3,6
ILDB X1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB X2
SOJG X3,.-6
CAME X4,1(IO)
JRST LOCFI1
LOCFI4: MOVE X1,(IO)
MOVEM X1,LCLFN1
MOVE X1,1(IO)
MOVEM X1,LCLFN2
LOCFI5: .CALL [ SETZ
SIXBIT/OPEN/
MOVSI .UAI
MOVEI
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
RETURN
.CLOSE
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR <IO>
CALLR LOCC
SETO X1,
CAMN X1,FSBUF
JRST LOCNI0
CAMN X1,ESBUF
JRST LOCNI0
RETURN SKIP,1
LOCNI0: MOVE IO,DIRBLK+1
ADDI IO,DIRBLK
CAIN IO,DIRBLK+2000
RETURN SKIP,1
MOVEI X1,5
ADDM X1,DIRBLK+1
SETO X1,
CAME X1,FSBUF
JRST LOCNI1
CAME X1,ESBUF
JRST LOCNI2
JRST LOCNI3
LOCNI1: MOVE X1,[POINT 7,FSBUF]
MOVE X2,[POINT 6,X4]
MOVEI X3,6
SETZ X4,
ILDB X1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB X2
SOJG X3,.-6
CAMN X4,(IO)
JRST LOCNI3
JRST LOCNI0
LOCNI2: MOVE X1,[POINT 7,ESBUF]
MOVE X2,[POINT 6,X4]
MOVEI X3,6
SETZ X4,
ILDB X1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB X2
SOJG X3,.-6
CAME X4,1(IO)
JRST LOCNI0
LOCNI3: MOVE X1,(IO)
MOVEM X1,LCLFN1
MOVE X1,1(IO)
MOVEM X1,LCLFN2
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI LCI
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCNI0
SKIPN GBUF1
JRST LOCNI4
MOVE X1,[POINT 6,LCLFN1]
MOVEI X2,6
MOVE X3,[POINT 7,FBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
LOCNI4: SKIPN GBUF2
JRST LOCNI5
MOVE X1,[POINT 6,LCLFN2]
MOVEI X2,6
MOVE X3,[POINT 7,EBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
LOCNI5: .IOT TTO,[" "]
.IOT TTO,["("]
TSOUT <FBUF>
.IOT TTO,["."]
TSOUT <EBUF>
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR <IO>
SETZ X1,
SETO X2,
CAMN X2,FSBUF
TRO X1,400000
CAMN X2,ESBUF
TRO X1,200000
JUMPE X1,RETN(0)
MOVE X2,[POINT 7,ABUF]
MOVE X3,[POINT 7,FSBUF]
TRNE X1,400000
HRRI X3,FBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
SKIPN ESBUF
JRST LOCNOO
MOVEI X4,"."
DPB X4,X2
MOVE X3,[POINT 7,ESBUF]
TRNE X1,200000
HRRI X3,EBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
LOCNOO: MOVEI IO,ABUF
CALLR LUTFN
.IOT TTO,[" "]
.IOT TTO,["("]
TSOUT ABUF
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE 0,[SIXBIT/DFTP/]
SETNAM 0,
OPEN 0,[ 200 ; TURN OFF TTY ECHOING
SIXBIT /TTY/
0]
THUD
CALLR ICP
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <IO,UTIL>
MSTIME X1,
IDIVI X1,↑D1000
MOVEM X1,NTIME
MOVE IO,[-GET$F,,FBUF]
CALLR NUTFB
RETURN
MOVEI IO,GET$F
MOVEM IO,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[GET$E,,EBUF]
CALLR NUTFB
MOVEI IO,GET$E
ADDM IO,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[GET$D,,ABUF]
CALLR NUTFB
MOVEI IO,GET$D
ADDM IO,NSIZE
SETZ UTIL,
ADD UTIL,<ABUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[POINT 7,ABUF]
CALLR LUTTSN
DPB IO,[001400,,LFILE+2]
LSH IO,-14
DPB IO,[170300,,LFILE+1]
DPB UTIL,[141300,,LFILE+2]
MOVE IO,[1,,ABUF]
CALLR NUTFB
AOS NSIZE
MOVE X1,ABUF
ADDM X1,NSUM
MOVE IO,[1,,ABUF]
CALLR NUTFB
AOS NSIZE
MOVE X1,ABUF
ADDM X1,NSUM
SKIPLE X1
MOVE X1,LFCHAS
SKIPGE X1
MOVN X1,X1
DPB X1,[270400,,LFILE+2]
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
GETDAT: BEGINR <IO,UTIL,FLAG>
MOVE IO,[1,,ABUF]
CALLR NUTFB
MOVE FLAG,ABUF
JUMPE FLAG,GETD2
ADDM FLAG,NSUM
AOS NSIZE
ADDM FLAG,NSIZE
OUT LFCHAN,
JRST .+2
THUD
SETZ UTIL,
GETD1: CAIGE FLAG,SIZBLK
HRLI IO,(FLAG)
CAIL FLAG,SIZBLK
HRLI IO,SIZBLK
HRR IO,LFOBUF+1
ADDI IO,1
CALLR NUTFB
CAIGE FLAG,SIZBLK
MOVEI IO,(FLAG)
CAIL FLAG,SIZBLK
MOVEI IO,SIZBLK
SUBI FLAG,(IO)
HRRZ X1,LFOBUF+1
ADDM IO,LFOBUF+1
ADDI X1,(IO)
ADD UTIL,(X1)
SOJ X1,
SOJG IO,.-2
OUT LFCHAN,
JRST .+2
THUD
JUMPG FLAG,GETD1
GETD2: ADDM UTIL,NSUM
MOVE IO,[1,,ABUF]
CALLR NUTFB
MOVE IO,ABUF
ADDM IO,NSUM
AOS NSIZE
MOVE IO,[1,,ABUF]
CALLR NUTFB
MOVE IO,ABUF
ADDM IO,NSUM
AOS NSIZE
CAMN IO,UTIL
JRST GETD3
TSOUT <[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD3: MSTIME X1,
IDIVI X1,↑D1000
MOVE X2,NTIME
SUB X1,X2
MOVEM X1,NTIME
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <IO,BP,UTIL>
OUT DDCHAN,
JRST .+2
THUD
MSTIME X1,
IDIVI X1,↑D1000
MOVEM X1,NTIME
HRR BP,DDOBUF+1
HRLI BP,010700
MOVE UTIL,[POINT 7,FBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
MOVE UTIL,[POINT 7,EBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
LDB IO,[001400,,LFILE+2] ; CREATION DATE
LDB UTIL,[170300,,LFILE+1]
LSH UTIL,14
IORI IO,(UTIL)
LDB UTIL,[141300,,LFILE+2] ; CREATION TIME
CALLR LUTTNS
DATE IO,
MSTIME X1,
IDIVI X1,<↑D1000*↑D60>
MOVE UTIL,X1
CALLR LUTTNS
HRLI BP,004400
MOVE UTIL,VBUF
IDPB UTIL,BP
CALLR LOCS
IDPB IO,BP
LDB UTIL,[270400,,LFILE+2] ; DATA MODE
SKIPE UTIL
MOVN UTIL,UTIL
IDPB UTIL,BP
HRRZ IO,DDOBUF+1
MOVEM BP,DDOBUF+1
HRRZI BP,(BP)
HRRZI X1,(BP)
SUBI BP,-1(IO)
MOVEM BP,NSIZE
SETZ UTIL,
ADD UTIL,(X1)
SOJ X1,
SOJG BP,.-2
ADDM UTIL,NSUM
OUT DDCHAN,
JRST .+2
THUD
ENDR
; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT: BEGINR <IO,UTIL>
CALLR LOCS
AOS NSIZE
ADDM IO,NSUM
ADDM IO,NSIZE
AOS DDOBUF+1
MOVEM IO,@DDOBUF+1
OUT DDCHAN,
JRST .+2
THUD
SETZ UTIL,
PUTD1: SOSG LFIBUF+2
IN LFCHAN,
CAIA
JRST PUTD2
ILDB X1,LFIBUF+1
ADD UTIL,X1
SOSG DDOBUF+2
OUT DDCHAN,
CAIA
THUD
IDPB X1,DDOBUF+1
JRST PUTD1
PUTD2: STATO LFCHAN,20000
THUD
AOS NSIZE
ADDM UTIL,NSUM
ADDM UTIL,NSUM
AOS DDOBUF+1
MOVEM UTIL,@DDOBUF+1
OUT DDCHAN,
JRST .+2
THUD
MSTIME X1,
IDIVI X1,↑D1000
MOVE X2,NTIME
SUB X1,X2
MOVEM X1,NTIME
ENDR
; TOPS-10 ICP: 1) SET CONNECTION SOCKETS IN LISTENING STATE
; 2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 3) OPEN CONNECTION SOCKETS
; A) EVEN - RECEIVE
; B) ODD - SEND
;
ICP: BEGINR <IO,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG: SETZM ICPBLK+.IBDEV
SETZM DCIBLK+.IBDEV
SETZM DCOBLK+.IBDEV
SETZM DCIBLK+.IBRMT
SETZM DCOBLK+.IBRMT
MOVE IO,LINP ; LISTEN ON INPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST .+2
JRST ICPICP
MOVE IO,DCIBLK+.IBERR
CAIE IO,.IESKT
JRST ICPEIL
MOVE IO,PWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
LDB X4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,102
SETZ X3,
SETZ FLAG,
ICPRDV: MOVE IO,[SIXBIT/IMP/] ; RESET DEVICE(S) USED
MOVEM IO,WRKBLK+.IBDEV
MOVEI X1,(X3)
IDIVI X1,10
JUMPE X1,ICPRD1
ADDI X1,20
ADDI X2,20
DPB X1,[140600,,WRKBLK+.IBDEV]
DPB X2,[060600,,WRKBLK+.IBDEV]
JRST ICPRD2
ICPRD1: ADDI X2,20
DPB X2,[140600,,WRKBLK+.IBDEV]
ICPRD2: SETZM WRKBLK+.IBLCL
MOVE IO,SWRK
CALL IO,[SIXBIT/IMPUUO/] ; TEST STATUS OF SOCKET
JRST ICPRD3
HRRZ IO,WRKBLK+.IBHST ; FOREIGN HOST
CAIE IO,DCHOST
JRST ICPRD3
PJOB X1,
HLRZ X2,WRKBLK+.IBSTT ; OWNING JOB
CAIE X2,(X1)
JRST ICPRD3
MOVE IO,WRKBLK+.IBLCL
CAMN IO,UTIL ; DATALANGUAGE SOCKET(S)
JRST ICPCLS
SUBI IO,2
CAMN IO,UTIL ; INPUT DATA SOCKET
JRST ICPCLI
ICPRD3: MOVEI IO,1 ; OUTPUT DATA SOCKET
MOVEM IO,WRKBLK+.IBLCL
MOVE IO,SWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
HRRZ IO,WRKBLK+.IBHST
CAIE IO,DCHOST
JRST ICPRD4
PJOB X1,
HLRZ X2,WRKBLK+.IBSTT
CAIE X2,(X1)
JRST ICPRD4
MOVE IO,WRKBLK+.IBLCL
SUBI IO,3
CAMN IO,UTIL
JRST ICPCLO
ICPRD4: ADDI X3,1
CAIGE X3,(X4)
JRST ICPRDV
JUMPN FLAG,ICPBEG
TTCALL 3,[ASCIZ/ (Connections in use.)/]
EXIT
ICPCLS: MOVE IO,CWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVEI IO,1
MOVEM IO,WRKBLK+.IBLCL
MOVE IO,SWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVE IO,CWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ [Restarting]
/]
SETO FLAG,
JRST ICPRDV
ICPCLI: MOVE IO,CWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ (Retrieve interrupted: connection closed.)
/]
JRST ICPRDV
ICPCLO: MOVE IO,CWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ (Store interrupted: connection closed.)
/]
JRST ICPRDV
ICPICP: MOVE IO,DCIBLK+.IBDEV ; GET DEVICE NAME
MOVEM IO,DCOBLK+.IBDEV ; AND COPY IT FOR DUPLEX
MOVEM IO,DCCHAS+1
MOVE IO,LOUT ; LISTEN ON OUTPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPEOL
MOVE IO,OICP
CALL IO,[SIXBIT/IMPUUO/] ; OPEN CONNECTION
JRST ICPEC
MOVE IO,ICPBLK+.IBDEV ; GET DEVICE NAME
MOVEM IO,ICCHAS+1
OPEN DCCHAN,ICCHAS ; OPEN AS STANDARD DEVICE
JRST ICPEF
IN DCCHAN,
JRST .+2
JRST ICPET
MOVE IO,ICPBUF+1
MOVE IO,1(IO) ; GET THE SOCKET NUMBER
LSH IO,-4 ; RIGHT JUSTIFY 32 BITS
MOVEM IO,DCOBLK+.IBRMT
AOJ IO,
MOVEM IO,DCIBLK+.IBRMT
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
MOVE IO,CICP
CALL IO,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
MOVE IO,OINP ; OPEN INPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST NETEIC
MOVE IO,OOUT ; OPEN OUTPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST NETEOC
OPEN DCCHAN,DCCHAS
JRST NETECF
OUT DCCHAN,
JRST .+2
JRST NETEOT
MOVE IO,PWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST QUIT
HRRZ IO,WRKBLK+.IBHST
MOVEM IO,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK
STLOC==1 ; STATUS BITS RETURNED HERE
LSLOC==2 ; LOCAL SOCKET
WFLOC==3 ; WAIT FLAG
BSLOC==4 ; BYTE SIZE LOCATION
FSLOC==5 ; FOREIGN SOCKET
HLOC==6 ; HOST NUMBER
ERRBTS==763600 ; I/O ERROR BITS
ICPBEG: ; Tovar says this is the right thing to do - MRC
PJOB X2, ; GET JOB #
TIMER X1, ; GET A "RANDOM" VALUE
ANDI X1,377770 ; BUT INSURE ONLY A HALFWORD
MOVSS X4,X2 ; RECEIVE SOCKET
ADDI X2,(X1) ; THIS BARFUCIOUS CROCK IS BECAUSE SAIL
ADDI X4,(X1) ; DOESN'T ALWAYS RESET SOCKETS FAST ENOUGH
; AND ALL SORTS OF RANDOM CRAP HAPPENS.
ADDI X4,1 ; TRANSMIT SOCKET
MOVEI X1,13 ; SAIL'S HOST ADDRESS NUMBER
MOVEM X1,LHOST ; SAVE IT AWAY
INIT DCCHAN,17
SIXBIT /IMP/
0
JRST ICPLUZ
SETZM CONECB
MOVEM X2,CONECB+LSLOC
MOVEI X3,DCHOST
MOVEM X3,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI X3,40
MOVEM X3,CONECB+BSLOC
MOVEI X3,DCSOKT
MOVEM X3,CONECB+FSLOC
MTAPE DCCHAN,[
↑D15
BYTE (6) 2,24,0,12,12
] ; TIME OUT CLS, RFNM, RFC, AND INPUT
MTAPE DCCHAN,CONECB
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; NO CONNECTION TO LOGGER
INPUT DCCHAN,[IOWD 1,FRS#
0]
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
MOVE X3,FRS
LSH X3,-4
MOVEM X3,FRS
ADDI X3,1
MOVEM X3,FSS#
ADDI X2,2
MOVEM X2,LRS#
ADDI X4,2
MOVEM X4,LSS#
MOVE X1,CONECB+LSLOC
MOVEM X1,TERBLK+LSLOC
MTAPE DCCHAN,TERBLK ; RELEASE LOGGER
INIT DCCHAN,1
SIXBIT /IMP/
XWD DCOBUF,DCIBUF
JRST ICPLUZ
MTAPE DCCHAN,[
↑D15
BYTE (6) 5,24,0,12,0
] ; TIME OUT CLS, RFNM, AND RFC
MOVEI X1,↑D8
DPB X1,[POINT 6,DCIBUF+1,11]
DPB X1,[POINT 6,DCOBUF+1,11]
MOVEM X2,CONECB+LSLOC
MOVEI X3,DCHOST
MOVEM X3,CONECB+HLOC
SETZM CONECB+WFLOC
MOVEI X3,↑D8
MOVEM X3,CONECB+BSLOC
MOVE X3,FSS
MOVEM X3,CONECB+FSLOC
MTAPE DCCHAN,CONECB
MOVE X1,CONECB+STLOC
TRNN X1,-1
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; CAN'T CONNECT TO RECEIVE SIDE
CALLR CLSCHK ; SEE IF WE ARE REALLY OPEN
JRST ICPLUZ
AOS CONECB+LSLOC
SOS CONECB+FSLOC
MOVEI X3,↑D8
MOVEM X3,CONECB+BSLOC
MTAPE DCCHAN,CONECB
MOVE X1,CONECB+STLOC
TRNN X1,-1
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; CAN'T CONNECT TO SEND SIDE
CALLR CLSCHK
JRST ICPLUZ
MOVEI X3,4
MOVEM X3,CONECB
MTAPE DCCHAN,CONECB
MOVE X1,CONECB+STLOC
TLC X1,300000
TLCN X1,300000
TLNE X1,060000
JRST ICPLUZ
STATZ DCCHAN,ERRBTS
JRST ICPLUZ
SOS CONECB+LSLOC
CALLR CLSCHK
JRST ICPLUZ
MTAPE DCCHAN,CONECB
MOVE X1,CONECB+STLOC
TLC X1,300000
TLCN X1,300000
TLNE X1,060000
JRST ICPLUZ
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
CALLR CLSCHK
JRST ICPLUZ
RETURN
; HERE WHEN CONNECTION FAILS
ICPLUZ: OUTSTR [ASCIZ/? Cannot establish network connection/]
EXIT
>
; (((↑↑↑)))
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: MOVEI IO,"Z"-100
IDPB IO,DCOBUF+1
OUT DCCHAN,
JRST .+1
QUIT01: INPUT DCCHAN,
STATZ DCCHAN,20000
JRST QUIT02
SKIPE FLAGDD
CALLR NUTDD
JRST QUIT01
QUIT02: RELEAS DCCHAN, ; RELEASE INPUT/OUTPUT DEVICE
QUIT03: IFE F.SAIL,<
MOVE IO,COUT ; CLOSE OUTPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST NETEOC
>
QUIT04: IFE F.SAIL,<
MOVE IO,CINP ; CLOSE INPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST NETEIC
>
EXIT
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
IFN F.SAIL,<
OPEN DDCHAN,DDCHAS
JRST NETOI2
SETZM CONECB
MOVE X1,LRS
ADDI X1,2
MOVEM X1,CONECB+LSLOC
MOVEI X1,DCHOST
MOVEM X1,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI X1,↑D36
MOVEM X1,CONECB+BSLOC
MOVE X1,FSS
ADDI X1,2
MOVEM X1,CONECB+FSLOC
MTAPE DDCHAN,CONECB
STATZ DDCHAN,ERRBTS
JRST NETOI2
RETURN SKIP,1
>
IFE F.SAIL,<
SETZM DCDBLK+.IBDEV
MOVEI X1,104
MOVEM X1,DCDBLK+.IBLCL
MOVE X1,DCIBLK+.IBRMT
ADDI X1,2
MOVEM X1,DCDBLK+.IBRMT
MOVE X1,ODAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETOI2
MOVE X1,DCDBLK+.IBDEV
MOVEM X1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOI1
RETURN SKIP,1
NETOI1: MOVE X1,CDAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETOI2
>
NETOI2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
IFN F.SAIL,<
OPEN DDCHAN,DDCHAS
JRST NETOO2
SETZM CONECB
MOVE X1,LSS
ADDI X1,2
MOVEM X1,CONECB+LSLOC
MOVEI X1,DCHOST
MOVEM X1,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI X1,↑D36
MOVEM X1,CONECB+BSLOC
MOVE X1,FRS
ADDI X1,2
MOVEM X1,CONECB+FSLOC
MTAPE DDCHAN,CONECB
STATZ DDCHAN,ERRBTS
JRST NETOO2
RETURN SKIP,1
>
IFE F.SAIL,<
SETZM DCDBLK+.IBDEV
MOVEI X1,105
MOVEM X1,DCDBLK+.IBLCL
MOVE X1,DCOBLK+.IBRMT
ADDI X1,2
MOVEM X1,DCDBLK+.IBRMT
MOVE X1,ODAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETOO2
MOVE X1,DCDBLK+.IBDEV
MOVEM X1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOO1
RETURN SKIP,1
NETOO1: MOVE X1,CDAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETOO2
>
NETOO2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
RELEAS DDCHAN,
IFE F.SAIL,<
MOVE X1,CDAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETC1
RETURN
NETC1: TTCALL 3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
; OUT: UTIL
;
NETDSI: BEGINR
IFN F.SAIL,<MOVE UTIL,LRS
ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,104>
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
; OUT: UTIL
;
NETDSO: BEGINR
IFN F.SAIL,<MOVE UTIL,LSS
ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,105>
ENDR
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI: BEGINR
SETO X1,
CAMN X1,FSBUF
JRST NETFI0
CAMN X1,ESBUF
JRST NETFI0
JRST NETFI1
NETFI0: TTCALL 3,[ASCIZ/ (/]
TTCALL 3,LUTDSF
TTCALL 3,[ASCIZ/)
/]
NETFI1: SKIPN GBUF1
JRST NETFI2
MOVE X1,[POINT 6,LFILE]
MOVEI X2,6
MOVE X3,[POINT 7,FBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
NETFI2: SKIPN GBUF2
RETURN
MOVE X1,[POINT 6,LFILE+1]
MOVEI X2,3
MOVE X3,[POINT 7,EBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
ENDR
; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI: BEGINR
IN DCCHAN,
JRST .+2
JRST NETEIT
SKIPE FLAGDD
CALLR NUTDD
ENDR
; NETWORK UTILITY -- MESSAGE OUTPUT
; IN: X1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO: BEGINR <IO,BP>
SKIPE FLAGDD
OUTSTR (X1)
MOVEI BP,(X1)
HRLI BP,(POINT 7,)
NUTMOL: ILDB IO,BP
JUMPE IO,RETN(0)
SKIPE DCOBUF+2
JRST NUTMOB
NUTMOO: OUT DCCHAN,
JRST .+2
JRST NETEOT
NUTMOB: SOS DCOBUF+2
IDPB IO,DCOBUF+1
JRST NUTMOL
ENDR
; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD: BEGINR <IO,UTIL>
MOVE X1,DCIBUF+1
MOVE UTIL,DCIBUF+2
NUTDDL: SOJL UTIL,RETN(0)
ILDB IO,X1
JUMPE IO,NUTDDL
TTCALL 1,IO
JRST NUTDDL
ENDR
; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
; IN: IO -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB: BEGINR
HLRE X1,IO
SKIPGE X1
MOVN X1,X1
HRRZI X2,(IO)
SKIPE DDIBUF+2
JRST NUTFB2
NUTFB1: IN DDCHAN,
JRST NUTFB2
SKIPL IO
THUD
STATO DDCHAN,020000
THUD
RETURN
NUTFB2: HRRZ X3,DDIBUF+1
HRLI X2,1(X3)
MOVEI X3,(X1)
CAMLE X3,DDIBUF+2
MOVE X3,DDIBUF+2
ADDI X3,-1(X2)
BLT X2,(X3)
CAMG X1,DDIBUF+2
JRST NUTFB3
SUB X1,DDIBUF+2
MOVEI X2,1(X3)
JRST NUTFB1
NUTFB3: ADDM X1,DDIBUF+1
MOVE X2,DDIBUF+2
SUBI X2,(X1)
MOVEM X2,DDIBUF+2
SKIPL IO
RETURN
ENDR SKIP,1
; FATAL NETWORK ERROR MESSAGES
;
; (((NOT SAIL)))
IFE F.SAIL,<
ICPERD: TTCALL 3,[ASCIZ / ?? Restart failure ??/]
EXIT
ICPEIL: TTCALL 3,[ASCIZ / ?? Input socket listen failure ??/]
EXIT
ICPEOL: TTCALL 3,[ASCIZ / ?? Output socket listen failure ??/]
JRST QUIT04
ICPET: TTCALL 3,[ASCIZ / ?? ICP failure (transfer) ??/]
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
ICPEZ: MOVE IO,CICP
CALL IO,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
JRST QUIT03
ICPEF: TTCALL 3,[ASCIZ / ?? ICP failure (file control) ??/]
JRST ICPEZ
ICPEC: TTCALL 3,[ASCIZ / The datacomputer is unavailable/]
MOVE 0,ICPBLK+.IBERR
CAIN 0,.IESOF ; SOCKET OPEN FAILURE
TTCALL 3,[ASCIZ / (rejecting)/]
CAIN 0,.IEDWN
TTCALL 3,[ASCIZ / (down)/]
CAIN 0,.IETIM
TTCALL 3,[ASCIZ / (timeout)/]
TTCALL 3,[ASCIZ /.
/]
MOVE IO,CICP
CALL IO,[SIXBIT/IMPUUO/]
JRST QUIT03
JRST QUIT03
NETEIC: TTCALL 3,[ASCIZ / ?? Input failure (connection) ??/]
EXIT
NETEOC: TTCALL 3,[ASCIZ / ?? Output failure (connection) ??/]
JRST QUIT04
NETECF: TTCALL 3,[ASCIZ / ?? File control failure ??/]
JRST QUIT03
>
; (((↑↑↑)))
NETEIT: TTCALL 3,[ASCIZ / ?? Input failure (transfer) ??/]
JRST QUIT
NETEOT: TTCALL 3,[ASCIZ / ?? Output failure (transfer) ??/]
JRST QUIT
; (((SAIL)))
IFE F.SAIL,<
OICP: .IUCON,,ICPBLK
CICP: .IUCLS,,ICPBLK
LINP: .IULSN,,DCIBLK
OINP: .IUCON,,DCIBLK
CINP: .IUCLS,,DCIBLK
LOUT: .IULSN,,DCOBLK
OOUT: .IUCON,,DCOBLK
COUT: .IUCLS,,DCOBLK
ODAT: 001000+.IUCON,,DCDBLK ; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT: .IUCLS,,DCDBLK
PWRK: .IULHS,,WRKBLK
SWRK: .IUSTT,,WRKBLK
CWRK: .IUCLS,,WRKBLK
>
; (((↑↑↑)))
;(((SAIL)))
IFN F.SAIL,<
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME
CLSCHK: BEGINR
MTAPE DCCHAN,STTBLK
MOVE X1,STTBLK+1
IOR X1,STTBLK+2
STATO DCCHAN,ERRBTS
TLNN X1,060000
RETURN SKIP,1
ENDR
>
;(((↑↑↑↑)))
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOI1
SETZM LFILE+3 ; JUST GUESS WHAT A NEGATIVE NUMBER
; WITH SIZE DOES ON SAIL WITH SIXBIT
; PPN'S!!!(YOU GUESSED IT...)
LOOKUP LFCHAN,LFILE ; PREPARE FILE FOR INPUT
JRST LOCOI2
RETURN SKIP,1
LOCOI1: TTCALL 3,[ASCIZ / ?? Local channel OPEN failure ??
/]
RELEAS LFCHAN,
RETURN
LOCOI2: TTCALL 3,[ASCIZ / (Local file not found.)
/]
RELEAS LFCHAN,
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR <IO,<IO+1>>
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS
JRST LOCOO2
MOVE IO,<LFILE+1>
MOVE <IO+1>,<LFILE+2>
SETZM LFILE+3
LOOKUP LFCHAN,LFILE
JRST LOCOO1
TAIN <[ASCIZ / [Old Local File][Confirm]/]>
JRST .+3
JRST .+2
JRST LOCOO1
RELEAS LFCHAN,
RETURN
LOCOO1: RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOO2
MOVEM IO,<LFILE+1>
MOVEM <IO+1>,<LFILE+2>
SETZM LFILE+3
ENTER LFCHAN,LFILE ; PREPARE FILE FOR OUTPUT
JRST LOCOO2
RETURN SKIP,1
LOCOO2: TTCALL 3,[ASCIZ / ?? Local file creation failure ??
/]
RELEAS LFCHAN,
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
RELEAS LFCHAN,
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: IO -- SIZE IN WORDS
;
LOCS: BEGINR
SKIPL LFILE+3
JRST LOCS1
HLRO IO,LFILE+3 ; SIZE IN WORDS
MOVN IO,IO
RETURN
LOCS1: HLRZ IO,LFILE+3 ; SIZE IN BLOCKS
IMULI IO,SIZBLK
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR <IO>
SETZM GBUF1
LDB X1,[350700,,FBUF]
CAIN X1,"*"
SETOM GBUF1
SETZM GBUF2
LDB X1,[350700,,EBUF]
CAIN X1,"*"
SETOM GBUF2
SETO X1,
CAMN X1,FSBUF
JRST LOCFI0
CAMN X1,ESBUF
JRST LOCFI0
JRST LOCFI5
LOCFI0: SETZM LUTDSP
LOCFI1: CALLR LUTDS
JRST .+2
JRST .+3
TTCALL 3,[ASCIZ/ (No Such File)
/]
RETURN
SETO X1,
CAME X1,FSBUF
JRST LOCFI2
CAME X1,ESBUF
JRST LOCFI3
JRST LOCFI4
LOCFI2: MOVE X1,[POINT 7,FSBUF]
MOVE X2,[POINT 7,LUTDSF]
ILDB X3,X1
ILDB X4,X2
JUMPE X3,.+4
CAIN X3,(X4)
JRST .-4
JRST LOCFI1
JUMPE X4,LOCFI4
CAIN X4,"."
JRST LOCFI4
JRST LOCFI1
LOCFI3: MOVE X1,[POINT 7,ESBUF]
MOVE X2,[POINT 7,LUTDSF]
ILDB X4,X2
JUMPE X4,.+4
CAIE X4,"."
JRST .-3
ILDB X4,X2
ILDB X3,X1
JUMPE X3,.+4
CAIN X3,(X4)
JRST .-4
JRST LOCFI1
JUMPE X4,LOCFI4
JRST LOCFI1
LOCFI4: HRRZI IO,LUTDSF
CALLR LUTFN
LOCFI5: CALLR LOCOI
RETURN
CALLR LOCC
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR <IO>
CALLR LOCC
SETO X1,
CAMN X1,FSBUF
JRST LOCNI0
CAMN X1,ESBUF
JRST LOCNI0
RETURN SKIP,1
LOCNI0: CALLR LUTDS
RETURN SKIP,1
SETO X1,
CAME X1,FSBUF
JRST LOCNI1
CAME X1,ESBUF
JRST LOCNI2
JRST LOCNI3
LOCNI1: MOVE X1,[POINT 7,FSBUF]
MOVE X2,[POINT 7,LUTDSF]
ILDB X3,X1
ILDB X4,X2
JUMPE X3,.+4
CAIN X3,(X4)
JRST .-4
JRST LOCNI0
JUMPE X4,LOCNI3
CAIN X4,"."
JRST LOCNI3
JRST LOCNI0
LOCNI2: MOVE X1,[POINT 7,ESBUF]
MOVE X2,[POINT 7,LUTDSF]
ILDB X4,X2
JUMPE X4,.+4
CAIE X4,"."
JRST .-3
ILDB X4,X2
ILDB X3,X1
JUMPE X3,.+4
CAIN X3,(X4)
JRST .-4
JRST LOCNI0
JUMPE X4,LOCNI3
JRST LOCNI0
LOCNI3: HRRZI IO,LUTDSF
CALLR LUTFN
CALLR LOCOI
JRST LOCNI0
TTCALL 3,[ASCIZ/ (/]
TTCALL 3,LUTDSF
TTCALL 3,[ASCIZ/)
/]
SKIPN GBUF1
JRST LOCNI4
MOVE X1,[POINT 6,LFILE]
MOVEI X2,6
MOVE X3,[POINT 7,FBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
LOCNI4: SKIPN GBUF2
RETURN
MOVE X1,[POINT 6,LFILE+1]
MOVEI X2,3
MOVE X3,[POINT 7,EBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR <IO>
SETZ X1,
SETO X2,
CAMN X2,FSBUF
TRO X1,400000
CAMN X2,ESBUF
TRO X1,200000
JUMPE X1,RETN(0)
MOVE X2,[POINT 7,ABUF]
MOVE X3,[POINT 7,FSBUF]
TRNE X1,400000
HRRI X3,FBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
SKIPN ESBUF
JRST LOCNO0
MOVEI X4,"."
DPB X4,X2
MOVE X3,[POINT 7,ESBUF]
TRNE X1,200000
HRRI X3,EBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
LOCNO0: MOVEI IO,ABUF
CALLR LUTFN
TTCALL 3,[ASCIZ/ (/]
TTCALL 3,ABUF
TTCALL 3,[ASCIZ/)
/]
ENDR
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IO,BP,UTIL>
HRRI BP,(IO)
HRLI BP,(POINT 7,)
SETZM LFILE ; CLEAR OLD FILE NAME
SETZM LFILE+1 ; AND EXTENSION
SETZM LFILE+2
SETZM LFILE+3
MOVEI X1,LUTFNT ; INITIALIZE XCT PNTR
MOVEI X2,LFILE ; SET DESTINATION OF IOR
SETZ UTIL,
LUTFN1: ILDB IO,BP
JUMPE IO,RETN(0)
CAIN IO,"." ; PREPARE FOR FILE EXTENSION IF "."
JRST LUTFN2
CAILE UTIL,5
JRST LUTFN1
ADDI IO,40 ; CONVERT TO SIXBIT BY ADDITION
ANDI IO,77 ; AND REMOVAL OF HIGH BITS
XCT (X1) ; EXECUTE THE PROPER ROTATE
IORM IO,(X2) ; IOR RESULT INTO FILE OR FILE+1
AOJ X1, ; INCREMENT THE XCT PNTR
AOJA UTIL,LUTFN1
LUTFN2: CAIN X2,LFILE+1
JRST RETN(0) ; IGNORE MULTIPLE EXTENSIONS
MOVEI X1,LUTFNT ; RESET PNTRS FOR EXTENSION
MOVEI X2,LFILE+1
MOVEI UTIL,3
JRST LUTFN1
LUTFNT: ROT IO,-6 ; HIGH ORDER
ROT IO,-14
ROT IO,22
ROT IO,14
ROT IO,6
ROT IO,0 ; LOW ORDER
ENDR
; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS: BEGINR
SKIPN LUTDSP
JRST LUTDSS
LUTDS1: JSP X1,LUTDSI
JUMPE X2,[ JSP X1,LUTDSI
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP X1,LUTDSI>
>
; (((↑↑↑)))
JRST LUTDS1] ; IGNORE HOLES IN DIRECTORY
MOVE X3,[POINT 7,LUTDSF]
LUTDS2: SETZ X1,
LSHC X1,6
ADDI X1," "
IDPB X1,X3
JUMPN X2,LUTDS2
MOVEI X1,"."
IDPB X1,X3
JSP X1,LUTDSI
ANDCMI X2,-1
LUTDS3: SETZ X1,
LSHC X1,6
ADDI X1," "
IDPB X1,X3
JUMPN X2,LUTDS3
SETZ X1,
IDPB X1,X3
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP X1,LUTDSI> ;IGNORE EXTRA SAIL UFD CRUFT
>
; (((↑↑↑)))
RETURN SKIP,1
LUTDSI: SOSG LDIBUF+2
IN LDCHAN,
CAIA
JRST LUTDSD
ILDB X2,LDIBUF+1
JRST (X1)
LUTDSS: RELEAS LDCHAN,
GETPPN X1,
MOVEM X1,LDIR
MOVE X1,[SIXBIT/UFD/]
MOVEM X1,LDIR+1
SETZM LDIR+2
IFE F.SAIL,<MOVE X1,[1,,1]>
IFN F.SAIL,<MOVE X1,[SIXBIT/ 1 1/]>
MOVEM X1,LDIR+3
OPEN LDCHAN,LDCHAS
JRST LUTDSE
LOOKUP LDCHAN,LDIR
JRST LUTDSE
SETOM LUTDSP
JRST LUTDS1
LUTDSD: STATO LDCHAN,20000
LUTDSE: TTCALL 3,[ASCIZ/ ?? Local directory failure ??
/]
RELEAS LDCHAN,
ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
; IN: IO -- DATE INTEGER
; UTIL -- TIME INTEGER
; BP -- BYTE POINTER TO DESTINATION STRING
; OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS: BEGINR
MOVE X1,IO
IDIVI X1,↑D31
MOVEI X3,(X1)
MOVEI X1,1(X2)
IDIVI X1,↑D10
ADDI X1,"0"
ADDI X2,"0"
IDPB X1,BP
IDPB X2,BP
MOVEI X1,"-"
IDPB X1,BP
MOVEI X1,(X3)
IDIVI X1,↑D12
MOVEI X3,(X1)
HRRI X1,LUTTM(X2)
HRLI X1,(POINT 7,)
SCOPY (X1,BP)
MOVEI X1,"-"
IDPB X1,BP
MOVEI X1,↑D64(X3)
IDIVI X1,↑D10
ADDI X1,"0"
ADDI X2,"0"
IDPB X1,BP
IDPB X2,BP
MOVEI X1," "
IDPB X1,BP
MOVE X1,UTIL
IDIVI X1,↑D60
MOVEI X3,(X2)
IDIVI X1,↑D10
ADDI X1,"0"
ADDI X2,"0"
IDPB X1,BP
IDPB X2,BP
MOVEI X1,":"
IDPB X1,BP
MOVEI X1,(X3)
IDIVI X1,↑D10
ADDI X1,"0"
ADDI X2,"0"
IDPB X1,BP
IDPB X2,BP
SETZ X1,
IDPB X1,BP
ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
; IN: IO -- ADDRESS OF TIME STRING
; OUT: IO -- DATE INTEGER
; UTIL -- TIME INTEGER
;
LUTTSN: BEGINR <BP>
MOVE BP,IO
SETZ IO,
SETZ UTIL,
ILDB X1,BP
CAIL X1,"0"
CAILE X1,"9"
RETURN
MOVEI X4,-"0"(X1)
IMULI X4,↑D10
ILDB X1,BP
ADDI X4,-"0"(X1)
ILDB X1,BP
CAIE X1,"-"
RETURN
MOVE X3,[POINT 7,X2]
SETZ X2,
ILDB X1,BP
IDPB X1,X3
ILDB X1,BP
IDPB X1,X3
ILDB X1,BP
IDPB X1,X3
MOVEI X3,↑D11
CAMN X2,LUTTM(X3)
JRST .+3
SOJGE X3,.-2
RETURN
ILDB X1,BP
CAIE X1,"-"
RETURN
ILDB X1,BP
MOVEI X2,-"0"(X1)
IMULI X2,↑D10
ILDB X1,BP
ADDI X2,-"0"(X1)
SUBI X2,↑D64
IMULI X2,↑D12
ADDI X2,(X3)
IMULI X2,↑D31
ADDI X2,-1(X4)
ILDB X1,BP
CAIE X1," "
RETURN
ILDB X1,BP
MOVEI X3,-"0"(X1)
IMULI X3,↑D10
ILDB X1,BP
ADDI X3,-"0"(X1)
IMULI X3,6
ILDB X1,BP
CAIE X1,":"
RETURN
ILDB X1,BP
ADDI X3,-"0"(X1)
IMULI X3,↑D10
ILDB X1,BP
ADDI X3,-"0"(X1)
MOVE IO,X2
MOVE UTIL,X3
ENDR
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM: ASCII /JAN/
ASCII /FEB/
ASCII /MAR/
ASCII /APR/
ASCII /MAY/
ASCII /JUN/
ASCII /JUL/
ASCII /AUG/
ASCII /SEP/
ASCII /OCT/
ASCII /NOV/
ASCII /DEC/
; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS: MOVE IO,[IN DDCHAN,]
CAMN IO,-3(FLAG)
JRST IOERDD
MOVE IO,[OUT DDCHAN,]
CAMN IO,-3(FLAG)
JRST IOERDD
MOVE IO,[IN LFCHAN,]
CAMN IO,-3(FLAG)
JRST IOERLF
MOVE IO,[OUT LFCHAN,]
CAMN IO,-3(FLAG)
JRST IOERLF
TTCALL 3,[ASCIZ/ ?? Impossible event at /]
MOVEI IO,-1(FLAG)
TNOUT (IO,10)
TTCALL 3,[ASCIZ / ??/]
EXIT
IOERDD: GETSTS DDCHAN,ABUF
JRST .+2
IOERLF: GETSTS LFCHAN,ABUF
TTCALL 3,[ASCIZ/ ?? Data error at /]
MOVEI IO,-3(FLAG)
TNOUT (IO,10)
TTCALL 3,[ASCIZ/ with status /]
MOVE IO,ABUF
TNOUT (IO,10)
TTCALL 3,[ASCIZ / ??
/]
SETOM FLAGDE
CALLR RENDER
JRST QUIT
JRST QUIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE X1,[SIXBIT/DFTP/]
SETNM
HRRZI X1,-1
RFMOD
TRZ X2,006000 ; (1B24+1B25)
SFMOD
MOVE X2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
MOVE X3,[252525,,253000] ; AND EOL'S (NO NULLS)
SFCOC
MOVEI X1,400000 ; FOR THIS FORK
MOVE X2,[LEVTAB,,CHNTAB]
SIR ; SET UP INTERRUPT TABLES
EIR ; ENABLE INTERRUPTS
MOVE X1,[17,,0] ; ↑O ON CHANNEL 0
ATI
MOVEI X1,400000 ; FOR THIS FORK
MOVE X2,[1B0+1B10+1B11+1B15] ; TTY, EOF, DATA ERROR, ILI
AIC ; ACTIVATE CHANNELS
SETZM FLAGCO
SETZM FLAGEF
CALLR ICP
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <BP,UTIL>
MOVEI X1,400000
RUNTM
IDIV X3,X2
MOVEM X3,NTIME
MOVE X1,DCDJFN
MOVE X2,[444400,,FBUF]
MOVNI X3,GET$F
SETOM FLAGEF
SIN
SKIPN FLAGEF
RETURN
SETZM FLAGEF
MOVEI BP,GET$F
MOVEM BP,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(BP)
SOJG BP,.-1
ADDM UTIL,NSUM
MOVE X1,DCDJFN
MOVE X2,[444400,,EBUF]
MOVNI X3,GET$E
SIN
MOVEI BP,GET$E
ADDM BP,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(BP)
SOJG BP,.-1
ADDM UTIL,NSUM
MOVE X1,DCDJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,GET$D
SIN
MOVEI BP,GET$D
ADDM BP,NSIZE
SETZ UTIL,
ADD UTIL,<PAGE-1>(BP)
SOJG BP,.-1
ADDM UTIL,NSUM
MOVE X1,[POINT 7,PAGE]
SETZ X2,
IDTIM
SETZ X2,
MOVEM X2,ABUF
MOVE X1,DCDJFN
BIN
AOS NSIZE
ADDM X2,NSUM
MOVEM X2,<ABUF+1>
BIN
AOS NSIZE
ADDM X2,NSUM
MOVEM X2,<ABUF+2>
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT: BEGINR <IO,BP,UTIL>
SETZ UTIL,
MOVE X1,DCDJFN
BIN
ADDM X2,NSUM
MOVN IO,X2
ADDI X2,3
ADDM X2,NSIZE
JUMPE IO,GETD2
GETD1: MOVE X1,DCDJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,SIZPAG
CAMGE X3,IO
MOVE X3,IO
SIN
HRRZ X1,LJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,SIZPAG
CAMGE X3,IO
MOVE X3,IO
SOUT
MOVN BP,IO
CAILE BP,SIZPAG
MOVEI BP,SIZPAG
ADD UTIL,<PAGE-1>(BP)
SOJG BP,.-1
ADDI IO,SIZPAG
JUMPL IO,GETD1
GETD2: MOVE X1,DCDJFN
BIN
ADD UTIL,X2
ADDM UTIL,NSUM
BIN
ADDM X2,NSUM
CAMN X2,UTIL
JRST GETD3
TSOUT <[ASCIZ/ (File Checksum Error.)/],CRLF>
GETD3: HRROI X1,LFILE
HRRZ X2,LJFN
MOVE X3,[022220,,000001]
JFNS
CALLR LOCC
SETO X1,
CAMN X1,FSBUF
JRST GETD4
CAMN X1,ESBUF
JRST GETD4
CAMN X1,VSBUF
JRST GETD4
JRST GETD5
GETD4: HRROI X1,[ASCIZ/ /]
PSOUT
HRROI X1,LFILE
PSOUT
HRROI X1,CRLF
PSOUT
GETD5: CALLR LOCOI
THUD
MOVE X3,<ABUF+2>
JUMPLE X3,GETD6
HRR X1,LJFN
HRLI X1,11 ; OFFSET 11
HRLZI X2,007700 ; BYTESIZE (B6-B11)
LSH X3,30
CHFDB
HRR X1,LJFN
HRLI X1,12 ; OFFSET 12 (BYTE COUNT)
SETO X2,
MOVE X3,<ABUF+1>
CHFDB
GETD6: SKIPN ABUF
JRST GETD7
MOVEI X1,400000
RPCAP
TRNN X2,600000 ; (1B18+1B19) WHEEL OR OPER
JRST GETD7
MOVE UTIL,X3
TRO X3,(X2)
EPCAP ; ENABLE (!)
HRR X1,LJFN
HRLI X1,14 ; OFFSET 14 (LAST WRITE)
SETO X2,
MOVE X3,ABUF
CHFDB
MOVEI X1,400000
MOVE X3,UTIL
EPCAP ; RESET CAPABILITIES
GETD7: MOVEI X1,400000
RUNTM
IDIV X3,X2
MOVE X2,NTIME
SUB X3,X2
MOVEM X3,NTIME
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <BP,UTIL>
MOVEI X1,400000
RUNTM
IDIV X3,X2
MOVEM X3,NTIME
MOVE BP,[POINT 7,PAGE]
MOVE UTIL,[POINT 7,FBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
MOVE UTIL,[POINT 7,EBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
HRRZ X1,LJFN
MOVE X2,[1,,14] ; 1 WORD, OFFSET 14 (LAST WRITE)
HRRZI X3,UBUF1
GTFDB
JRST PUTF1
SETZ X1,
IDPB X1,BP
JRST PUTF2
PUTF1: MOVE X1,BP
MOVE X2,UBUF1
SETZ X3,
ODTIM
IBP X1
MOVE BP,X1
PUTF2: GTAD
MOVE X2,X1
MOVE X1,BP
ODTIM
IBP X1
MOVEI BP,(X1)
MOVE UTIL,VBUF
MOVEM UTIL,1(BP)
ADDI BP,1
HRRZ X1,LJFN
MOVE X2,[2,,11] ; 2 WORDS, OFFSET 11 (BYTESIZE & COUNT)
HRRZI X3,UBUF1
GTFDB
JRST PUTF3
SETZM UBUF1
SETZM <UBUF1+1>
PUTF3: MOVE UTIL,<UBUF1+1>
MOVEM UTIL,1(BP)
LDB UTIL,[300600,,UBUF1]
MOVEM UTIL,2(BP)
ADDI BP,2
MOVEI UTIL,1(BP)
SUBI UTIL,PAGE
MOVEM UTIL,NSIZE
MOVEI BP,-1(UTIL)
SETZ UTIL,
ADD UTIL,PAGE(BP)
SOJGE BP,.-1
ADDM UTIL,NSUM
MOVE X1,DCDJFN
MOVE X2,[444400,,PAGE]
MOVN X3,NSIZE
SOUT
ENDR
; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT: BEGINR <IO,BP,UTIL>
CALLR LOCS
MOVE X1,DCDJFN
MOVE X2,IO
BOUT
ADDM X2,NSUM
ADDI X2,2
ADDM X2,NSIZE
MOVN IO,IO
SETZ UTIL,
JUMPE IO,PUTD2
PUTD1: HRRZ X1,LJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,SIZPAG
CAMGE X3,IO
MOVE X3,IO
SIN
MOVE X1,DCDJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,SIZPAG
CAMGE X3,IO
MOVE X3,IO
SOUT
MOVN BP,IO
CAILE BP,SIZPAG
MOVEI BP,SIZPAG
ADD UTIL,<PAGE-1>(BP)
SOJG BP,.-1
ADDI IO,SIZPAG
JUMPL IO,PUTD1
PUTD2: MOVE X1,DCDJFN
MOVE X2,UTIL
BOUT
ADDM UTIL,NSUM
ADDM UTIL,NSUM
MOVEI X2,21
MTOPR
MOVEI X1,400000
RUNTM
IDIV X3,X2
MOVE X2,NTIME
SUB X3,X2
MOVEM X3,NTIME
ENDR
; TENEX ICP: 1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 2) OPEN CONNECTION SOCKETS
; A) EVEN - INPUT
; B) ODD - OUTPUT
; JFN STRING: "NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP: BEGINR
MOVE X1,[POINT 7,UBUF1]
HRROI X2,[ASCIZ/NET:20./]
SETZ X3,
SOUT ; LOCAL SOCKET 20+JOBREL
MOVEI X2,DCHOST
MOVEI X3,10
CVHST
NOUT ; FAILURE -- MAKE HOST # INTO STRING
JRST .+1 ; CVHST SUCCESS OR NOUT FAILURE
MOVN X2,DCSOCK
NOUT
JRST .+1
HRLZI X1,1 ; SHORT GTJFN
HRROI X2,UBUF1
GTJFN ; ICP CONNECTION
JRST ICPEG
MOVE X2,[40B5+1B19] ; 32-BIT, READ
OPENF ; OPEN ICP CONNECTION
JRST ICPEO
BIN
MOVEM X2,ICPSOC
CLOSF
JRST ICPEC
MOVE X1,[POINT 7,UBUF1]
HRROI X2,[ASCIZ/NET:22./]
SETZ X3,
SOUT
MOVEI X2,DCHOST
MOVEI X3,10
CVHST
NOUT
JRST .+1
MOVN X2,ICPSOC
NOUT
JRST .+1
HRLZI X1,1
HRROI X2,UBUF1
GTJFN ; OUTPUT JFN
JRST ICPEIG
MOVEM X1,DCOJFN
HRLZI X1,1
HRROI X2,UBUF1
GTJFN ; INPUT JFN
JRST ICPEOG
MOVEM X1,DCIJFN
MOVE X2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
OPENF
JRST ICPEIO
MOVE X1,DCOJFN
MOVE X2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST ICPEOO
MOVE X1,[SIXBIT/LHOSTN/]
SYSGT
MOVEM X1,LHOST
ENDR
; NETWORK QUIT
;
QUIT: MOVE X1,DCOJFN
MOVEI X2,"Z"-100
BOUT
MOVEI X2,21
MTOPR
SETOM FLAGEF
QUIT01: DCBIN <IO>
SKIPE FLAGEF
JRST QUIT01
RESET
HALTF
JRST .-1 ; IN CASE OF "CONTINUE"
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
MOVE X1,[POINT 7,UBUF1]
HRROI X2,[ASCIZ/NET:24./]
SETZ X3,
SOUT
MOVEI X2,DCHOST
MOVEI X3,10
CVHST
NOUT
JRST .+1
MOVN X2,ICPSOC
SUBI X2,3
NOUT
JRST .+1
HRLZI X1,1
HRROI X2,UBUF1
GTJFN
JRST NETOI2
MOVEM X1,DCDJFN
MOVE X2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
OPENF
JRST NETOI1
RETURN SKIP,1
NETOI1: RLJFN
JRST NETOI2
NETOI2: HRROI X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
MOVE X1,[POINT 7,UBUF1]
HRROI X2,[ASCIZ/NET:25./]
SETZ X3,
SOUT
MOVEI X2,DCHOST
MOVEI X3,10
CVHST
NOUT
JRST .+1
MOVN X2,ICPSOC
SUBI X2,2
NOUT
JRST .+1
HRLZI X1,1
HRROI X2,UBUF1
GTJFN
JRST NETOO2
MOVEM X1,DCDJFN
MOVE X2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST NETOO1
RETURN SKIP,1
NETOO1: RLJFN
JRST NETOO2
NETOO2: HRROI X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
MOVE X1,DCDJFN
CLOSF
JRST NETC1
RETURN
NETC1: HRROI [ASCIZ/ ?? Network connection CLOSE failure ??
/]
PSOUT
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
; OUT: UTIL
;
NETDSI: BEGINR
GJINF
HRRZI UTIL,(X2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,24
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
; OUT: UTIL
;
NETDSO: BEGINR
GJINF
HRRZI UTIL,(X2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,25
ENDR
; NETFFI -- NETWORK FIX FIRST FILE NAME
;
NETFFI: BEGINR
MOVE X2,LJFN
TLNN X2,770000
JRST NETFI1
HRROI X1,LFILE
HRRZI X2,(X2)
SETZ X3,
JFNS
HRROI X1,[ASCIZ/ /]
PSOUT
HRROI X1,LFILE
PSOUT
HRROI X1,CRLF
PSOUT
NETFI1: SKIPN GBUF1
JRST NETFI2
HRROI X1,FBUF
HRRZ X2,LJFN
HRLZI X3,002000
JFNS
NETFI2: SKIPN GBUF2
JRST NETFI3
HRROI X1,EBUF
HRRZ X2,LJFN
HRLZI X3,000200
JFNS
NETFI3: SKIPL VSBUF
RETURN
MOVN X1,VBUF
MOVEM X1,VSBUF
ENDR
; FATAL NETWORK ERROR MESSAGES
;
NETEQ: PSOUT
RESET
HALTF
JRST .-1
ICPEG: HRROI X1,[ASCIZ/ The datacomputer is unavailable (network)./]
JRST NETEQ
ICPEO: HRROI X1,[ASCIZ/ The datacomputer is unavailable (down)./]
JRST NETEQ
ICPEC: HRROI X1,[ASCIZ/ ?? ICP CLOSF failure ??/]
JRST NETEQ
ICPEOG: HRROI X1,[ASCIZ/ ?? ICP output GTJFN failure ??/]
JRST NETEQ
ICPEIG: HRROI X1,[ASCIZ/ ?? ICP input GTJFN failure ??/]
JRST NETEQ
ICPEIO: HRROI X1,[ASCIZ/ ?? ICP output OPENF failure ??/]
JRST NETEQ
ICPEOO: HRROI X1,[ASCIZ/ ?? ICP input OPENF failure ??/]
JRST NETEQ
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
HRLZI X1,100101 ; OLD FILE, *'S, SHORT CALL
MOVE X2,[POINT 7,LFILE]
GTJFN
JRST LOCOI1
MOVEM X1,LJFN
HRRZI X1,(X1)
MOVE X2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCOI2
RETURN SKIP,1
LOCOI1: HRROI X1,[ASCIZ/ (Local file not found.)
/]
PSOUT
RETURN
LOCOI2: HRROI X1,[ASCIZ/ (Local file not available.)
/]
PSOUT
HRRZ X1,LJFN
RLJFN
RETURN
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
HRLZI X1,600001 ; VN, WRITE, SHORT
MOVE X2,[POINT 7,LFILE]
GTJFN
JRST LOCOO2
MOVEM X1,LJFN
MOVE X2,[440000,,100000] ; 36 BIT BYTE, READ
OPENF
JRST LOCOO1
RETURN SKIP,1
LOCOO1: HRRZ X1,LJFN
RLJFN
JRST .+1
LOCOO2: HRROI X1,[ASCIZ/ ?? Local file creation failure ??
/]
PSOUT
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
HRRZ X1,LJFN
CLOSF
JRST LOCC1
RETURN
LOCC1: HRROI X1,[ASCIZ/ ?? Local file CLOSE failure ??
/]
PSOUT
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: IO -- SIZE IN WORDS
;
LOCS: BEGINR
HRRZ X1,LJFN
MOVE X2,[2,,11] ; READ 2 WORDS, OFFSET OF 11
HRRZI X3,UBUF1
GTFDB
JRST .+3
SETZ IO,
RETURN
LDB X1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
MOVEI X2,↑D36
IDIVI X2,(X1) ; BYTES/WD
MOVE X3,UBUF1+1 ; BYTE COUNT TO EOF
ADDI X3,-1(X2) ; ACCOUNT FOR TRUNCATION
IDIVI X3,(X2) ; NUMBER OF WORDS
MOVE IO,X3
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR
SETZM GBUF1
LDB X1,[350700,,FBUF]
CAIN X1,"*"
SETOM GBUF1
SETZM GBUF2
LDB X1,[350700,,EBUF]
CAIN X1,"*"
SETOM GBUF2
CALLR LOCOI
RETURN
CALLR LOCC
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR
HRRZ X1,LJFN
TLO X1,400000
CLOSF
JRST .+1
LOCNI1: MOVE X1,LJFN
GNJFN
RETURN SKIP,1
HRRZI X1,(X1)
MOVE X2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCNI1
SKIPL VSBUF
JRST LOCNI2
MOVE X1,[LFILE,,UBUF1]
BLT X1,<UBUF1+SBSIZE-1>
LOCNI2: HRROI X1,LFILE
HRRZ X2,LJFN
SETZ X3,
JFNS
HRROI X1,[ASCIZ/ /]
PSOUT
HRROI X1,LFILE
PSOUT
HRROI X1,CRLF
PSOUT
SKIPL VSBUF
JRST LOCNI5
MOVE X1,[440700,,LFILE]
MOVE X2,[440700,,UBUF1]
LOCNI3: ILDB X3,X1
ILDB X4,X2
CAIE X3,(X4)
JRST LOCNI4
CAIE X3,";"
JUMPN X3,LOCNI3
AOS VBUF
JRST LOCNI5
LOCNI4: MOVN X1,VSBUF
MOVEM X1,VBUF
LOCNI5: SKIPN GBUF1
JRST LOCNI6
HRROI X1,FBUF
HRRZ X2,LJFN
HRLZI X3,002000
JFNS
LOCNI6: SKIPN GBUF2
RETURN
HRROI X1,EBUF
HRRZ X2,LJFN
HRLZI X3,000200
JFNS
RETURN
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR
SETZ X1,
SETO X2,
CAMN X2,FSBUF
TRO X1,400000
CAMN X2,ESBUF
TRO X1,200000
CAMN X2,VSBUF
TRO X1,100000
JUMPE X1,RETN(0)
MOVE X2,[POINT 7,LFILE]
MOVE X3,[POINT 7,FSBUF]
TRNE X1,400000
HRRI X3,FBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
SKIPN ESBUF
JRST LOCNO0
MOVEI X4,"."
DPB X4,X2
MOVE X3,[POINT 7,ESBUF]
TRNE X1,200000
HRRI X3,EBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
LOCNO0: SKIPG VSBUF
RETURN
MOVEI X4,";"
DPB X4,X2
MOVE X1,X2
MOVE X2,VSBUF
MOVEI X3,↑D10
NOUT
THUD
ENDR
; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI: SETOM FLAGCO
DEBRK
EOFPSI: SKIPN FLAGEF
JRST EOFPSE
SETZM FLAGEF
DEBRK ; RETURN FROM INTERRUPT
EOFPSE: MOVE UTIL,X1
HRROI X1,[ASCIZ/ ?? Unexpected EOF at /]
PSOUT
MOVEI X1,101
HRRZ X2,PSIPC1
SUBI X2,1
MOVEI X3,10
SETZ X4,
NOUT
JRST .+1
HRROI X1,[ASCIZ/ ??
/]
PSOUT
MOVE X1,(X2)
CAMN X1,[BIN]
JRST EOFPSD
CAMN X1,[BOUT]
JRST EOFPSD
CAMN X1,[SIN]
JRST EOFPSD
CAMN X1,[SOUT]
JRST EOFPSD
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
EOFPSD: CAMN UTIL,DCDJFN
JRST .+4
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
SETOM FLAGDD
MOVEI X1,QUIT
MOVEM X1,PSIPC1
DEBRK
DERPSI: MOVE UTIL,X1
HRROI X1,[ASCIZ/ ?? Data error at /]
PSOUT
MOVEI X1,101
HRRZ X2,PSIPC1
SUBI X2,1
MOVEI X3,10
SETZ X4,
NOUT
JRST .+1
HRROI X1,[ASCIZ/ ??
/]
PSOUT
MOVE X1,(X2)
CAMN X1,[BIN]
JRST DERPSD
CAMN X1,[BOUT]
JRST DERPSD
CAMN X1,[SIN]
JRST DERPSD
CAMN X1,[SOUT]
JRST DERPSD
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
DERPSD: CAMN UTIL,DCDJFN
JRST .+4
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
SETOM FLAGDD
MOVEI X1,QUIT
MOVEM X1,PSIPC1
DEBRK
ILIPSI: HRRZ X1,PSIPC1
MOVE X2,-1(X1)
CAMN X2,[GTFDB]
JRST ILIPSD
CAMN X2,[CHFDB]
JRST ILIPSD
HRROI X1,[ASCIZ/ ?? Illegal instruction at /]
CAMN X2,[-1]
HRROI X1,[ASCIZ/ ?? Impossible event at /]
PSOUT
MOVEI X1,101
HRRZ X2,PSIPC1
SUBI X2,1
MOVEI X3,10
SETZ X4,
NOUT
JRST .+1
HRROI X1,[ASCIZ/ ??
/]
PSOUT
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
ILIPSD: HRROI X1,[ASCIZ/ (Bad local device.)
/]
PSOUT
AOS PSIPC1
DEBRK ; RETURN FROM INTERRUPT
PSIQUI: HALTF
JRST PSIQUI
>
; (((↑↑↑)))
; ***DATA***
CRLF: BYTE (7)15,12,0,0,0
SEMI: BYTE (7)";",15,12,0,0
HOSTS: 5,,[ASCIZ/BBN/] ; TENEXE
11,,[ASCIZ/HARVARD/]
13,,[ASCIZ/SUAI/]
37,,[ASCIZ/CCA/]
40,,[ASCIZ/PARC/]
43,,[ASCIZ/ISI/] ; ISIR1
53,,[ASCIZ/OFFICE"-1/]
56,,[ASCIZ/RUTGERS/]
61,,[ASCIZ/BBN/] ; TENEXB
62,,[ASCIZ/BBN/] ; TENEXF
70,,[ASCIZ/SUMEX/]
102,,[ASCIZ/SRI/]
106,,[ASCIZ/ITS/] ; DMS
126,,[ASCIZ/ISI/] ; ISIA
161,,[ASCIZ/BBN/] ; TENEXD
164,,[ASCIZ/ISI/] ; ISIE
206,,[ASCIZ/ITS/] ; AI
226,,[ASCIZ/ISI/] ; ISIC
305,,[ASCIZ/BBN/] ; TENEXA
306,,[ASCIZ/ITS/] ; ML
326,,[ASCIZ/ISI/] ; ISID
354,,[ASCIZ/ITS/] ; MC
361,,[ASCIZ/BBN/] ; TENEXC
364,,[ASCIZ/ISI/] ; ISIB
0
LIT ; LITERALS GO HERE
; (((ITS)))
IFL F.TENX,<
IOBUFR: BLOCK 2000
LCLDEV: BLOCK 1 ; local device
LCLFN1: BLOCK 1
LCLFN2: BLOCK 1
LCLSNM: BLOCK 1 ; SNAME
RCHBLK: BLOCK 10 ; network status goes here
LCLRCV: BLOCK 1
LCLTRN: BLOCK 1
FORRCV: BLOCK 1
FORTRN: BLOCK 1
FFITYP: BLOCK 1
LCLDAT: BLOCK 1
DIRBLK: BLOCK 2000
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
RELOC 0
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBLK: SIXBIT /IMP/
0
100 ; LOCAL SOCKET
40,,DCHOST ; 32 BIT BYTES (ICP), CCA HOST
DCSOKT ; DATACOMPUTER SOCKET
DCIBLK: SIXBIT /IMP/
0
102 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP + 1
DCOBLK: SIXBIT /IMP/
0
103 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP
DCDBLK: SIXBIT /IMP/
0
0 ; LOCAL SOCKET (104 RECEIVE, 105 SEND)
44,,DCHOST ; 36 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP +2 OR +3
WRKBLK: BLOCK 5
ICCHAS: 10 ; IMAGE MODE
SIXBIT /IMP/
0,,ICPBUF
ICPBUF: BLOCK 3
DCCHAS: 0 ; 7 BIT ASCII MODE
SIXBIT /IMP/
DCOBUF,,DCIBUF
>
; (((↑↑↑)))
DCIBUF: BLOCK 3
DCOBUF: BLOCK 3
DDCHAS: 13 ; BINARY
SIXBIT /IMP/
DDOBUF,,DDIBUF
DDIBUF: BLOCK 3
DDOBUF: BLOCK 3
LFILE: 0 ; LOCAL FILE NAME
0 ; EXTENSION
0 ; PROTECTION AND CREATION DATE
0 ; PROJ-PROG - 0 IS SELF
LFCHAS: 13 ; BINARY MODE
SIXBIT /DSK/
LFOBUF,,LFIBUF
LFIBUF: BLOCK 3
LFOBUF: BLOCK 3
LDIR: 0 ; PROJ-PROG OF USER
0 ; "UFD"
0
0 ; [1,1]
LDCHAS: 13
SIXBIT /DSK/
0,,LDIBUF
LDIBUF: BLOCK 3
LUTDSP: 0
LUTDSF: BLOCK SBSIZE
; (((SAIL)))
IFN F.SAIL,<
CONECB: BLOCK 7
; OTHER RANDOM THINGS
TERBLK: 3 ; TERMINATE BLOCK
0 ; STATUS BITS
1 ; FOREIGN SOCKET LOC
0 ; DON'T WAIT
STTBLK: 2
BLOCK 2
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
LEVTAB: PSIPC1
PSIPC2
PSIPC3
PSIPC1: BLOCK 1
PSIPC2: BLOCK 1
PSIPC3: BLOCK 1
CHNTAB: 1,,TCOPSI
REPEAT 9,<EXP 0>
1,,EOFPSI
1,,DERPSI
REPEAT 3,<EXP 0>
1,,ILIPSI
REPEAT ↑D20,<EXP 0>
FLAGCO: 0
FLAGEF: 0
DCSOCK: DCSOKT
ICPSOC: 0 ; ICP SOCKET
DCIJFN: 0 ; DC INPUT JFN
DCOJFN: 0 ; DC OUTPUT JFN
DCDJFN: 0 ; DC DATA JFN
LFILE: BLOCK SBSIZE
LJFN: 0
LDIR: 0
VSBUF: 0
PAGE: BLOCK SIZPAG
>
; (((↑↑↑)))
; * VARIABLES
CMDMOD: 0
LHOST: 0
ANCHOR: ASCIZ /DFTP/
BLOCK <SBSIZE-2>
CONTEX: BLOCK LBSIZE
OPENED: BLOCK LBSIZE
OPENEM: 0
FLAGDD: 0
FLAGDE: 0
FLAGTT: -1
; * BLOCKS
NBUF: BLOCK LBSIZE
FBUF: BLOCK SBSIZE
EBUF: BLOCK SBSIZE
VBUF: 0
FSBUF: BLOCK SBSIZE
ESBUF: BLOCK SBSIZE
ABUF: BLOCK SBSIZE
UBUF1: BLOCK LBSIZE
UBUF2: BLOCK SBSIZE
GBUF1: BLOCK LBSIZE
GBUF2: BLOCK LBSIZE
NTIME: 0
NSIZE: 0
NSUM: 0
TCIPCL: BLOCK 100 ; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP: 0 ; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
BLOCK 37 ; (SIZE = # CHARS IN LARGEST CMD)
TCIPNF: 0 ; P(OSSIBLE)N(EXT)F(REE)
STSIZ==100
STBEG: BLOCK STSIZ
-1 ; CRETINOUS LINK-10 BUG
END DFTP
ββ